python - Beautifulsoup 使用页面源代码片段创建 Soup

标签 python selenium web-scraping beautifulsoup

通常,每当我使用 Beautifulsoup 来提取简单的数据时

soup = BeautifulSoup(driver.page_source, "html5lib")

简单。工作完成。

但是我正在处理一个包含大量数据的网站。它已经加载,所以我不需要担心加载时间,但我认为真正的 killer 是让我的 find_all 遍历我不需要查看的页面源。

我知道一旦我制作了汤,我就可以通过导航到类等来缩小我正在寻找的数据的范围……这很有效,但速度相当慢。事实上,即使使用 page_source 创建汤也相当慢。

我尝试过各种变体

soup = BeautifulSoup(driver.find_element_by_class_name('box'), "html5lib")

但没有成功。是否可以在不查看所有源代码的情况下执行类似的操作?我想以某种形式,它仍然需要加载源代码才能找到我想要它查看的类。但下载后,较小的汤可能会更快地浏览。

如果有人能在这里为我指明正确的方向,我将不胜感激。

TL;DR 我来自 page_source 的 soup 非常大,需要时间才能使用 selenium 进行导航,我可以在导航之前将我的 soup 限制为某个类名或其他名称吗?

最佳答案

当然,这正是SoupStrainer是关于:

The SoupStrainer class allows you to choose which parts of an incoming document are parsed.

例如,如果您希望 BeautifulSoup 仅解析具有 box 类的元素:

from bs4 import BeautifulSoup, SoupStrainer

only_box = SoupStrainer(class_="box")
BeautifulSoup(driver.page_source, "html5lib", parse_only=only_box)

顺便说一句,如果速度确实很重要,请考虑从 html5lib 切换到 lxml.html 解析器:

BeautifulSoup(driver.page_source, "lxml", parse_only=only_box)

关于python - Beautifulsoup 使用页面源代码片段创建 Soup,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36505469/

相关文章:

selenium - 如何使用 Selenium::WebDriver::Element#click 从 SELECT 元素中选择一个选项?

java - WebElement.equals() 方法如何检查相等性?

html - 从 div、class 和 span 元素中抓取网页

python - 反向 'update' 关键字参数 '{' id' : '' }' not found. 1 pattern(s) tried: [' update/(? P<id>[0-9]+)/\\Z']

python - 为不同平台构建 python wheels

python - 我想从 python 中的 azure 函数应用程序创建 Azure 容器实例 (ACI)

python - 在 scrapy 上找到合适的选择器 css 来爬取网页

python - 为什么这些列表方法(追加、排序、扩展、删除、清除、反转)返回 None 而不是结果列表?

java - 如何使用 JBehave 在多个 PageObject 中使用一个变量?

python - 在 requests.get() 方法的参数中使用 'headers' 是否会更改 HTML 代码或以某种方式影响它?