通常,每当我使用 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/