BeautifulSoup 不会从网页中提取所有表单

Posted

技术标签:

【中文标题】BeautifulSoup 不会从网页中提取所有表单【英文标题】:BeautifulSoup does not extract all forms from web page 【发布时间】:2017-08-19 13:26:46 【问题描述】:

我希望使用 Python3 和 BeautifulSoup 从给定网站中提取所有表单。

这是一个这样做的例子,但无法获取所有表单:

from urllib.request import urlopen
from bs4 import BeautifulSoup

url = 'https://www.qantas.com/au/en.html'
data = urlopen(url)
parser = BeautifulSoup(data, 'html.parser')
forms = parser.find_all('form')
for form in forms:
    print(form)
    print('\n\n')

如果您运行代码并访问 URL,您会注意到 Book a trip 表单没有被解析器抓取。

上面的代码只选择了三种形式,而在 Chrome 的 Developers tools > elements 页面中显示了 13 个 <form> 元素。但是如果我查看页面源(Chrome 中的Ctrl+U),源只显示了BeautifulSoup 抓取的三个表单。

如何抓取所有表单?

【问题讨论】:

不确定这里发生了什么,但是如果您转到该页面的“查看源代码”,它只会显示三个表单,这正是您所得到的。会不会是其他表单是在页面加载之后从服务器请求生成的? 【参考方案1】:

借助 phantomjs(http://phantomjs.org/download.html) 和 Selenium,您可以做到这一点

步骤:1.在终端或cmd使用命令:pip install selenium 2.下载phantomjs并解压,然后将“phantomjs.exe”放在python路径,例如windows,C:\Python27

比起使用这个代码,它会给你想要的结果:

# -*- coding: utf-8 -*-

from bs4 import BeautifulSoup
from  selenium import webdriver


url = 'https://www.qantas.com/au/en.html'


driver = webdriver.PhantomJS()
driver.get(url)

data = driver.page_source
parser = BeautifulSoup(data, 'html.parser')


forms = parser.find_all('form')
for form in forms:
    print(form)
    print('\n\n')

driver.quit()

它将打印所有 13 个表格。

注意:由于字数限制,无法在答案中输出。

【讨论】:

【参考方案2】:

该网页似乎使用 javascript 来加载网页内容。尝试使用javascript disabled 在浏览器中查看该页面。

检查您的表单是否存在。如果不是,请检查是否是控制台中的任何 XHR 请求获取表单。如果没有,你应该考虑去selenium with phantomjs无头浏览器或者放弃对本站的抓取!!

无头浏览器将允许您获取动态创建的网页的内容并将该内容提供给 BeautifulSoup。

【讨论】:

以上是关于BeautifulSoup 不会从网页中提取所有表单的主要内容,如果未能解决你的问题,请参考以下文章

python 使用BeautifulSoup和Python从网页中提取文本

如何从 BeautifulSoup 对象中提取 JSON?

如何使用 beautifulSoup 从网站中提取和下载所有图像?

在 BeautifulSoup 抓取之后从 Python 中的列表中提取数据,并创建 Pandas 表

BeautifulSoup get_text 不会去除所有标签和 JavaScript

如何在 BeautifulSoup 中添加“href contains”条件