假设您只想对文档的 <a> 标签使用 Beautiful Soup。通常,您会解析树并使用 find_all() 方法,并将 required 标签作为参数。
soup = BeautifulSoup(fp, "html.parser")
tags = soup.find_all('a')
但这不仅耗时,还会无谓地占用更多内存。相反,你可以创建一个 SoupStrainer
类的对象,并将其作为 BeautifulSoup
构造器中的 parse_only
参数的值。
SoupStrainer
告诉 Beautiful Soup 需要提取哪些部分,而解析树仅由这些元素组成。如果你将所需信息限定为 HTML 的特定部分,这将加速你的搜索结果。
product = SoupStrainer('div', {'id': 'products_list'})
soup = BeautifulSoup(html, parse_only=product)
上述代码行只会解析来自产品站点的标题,这些标题可能位于某个标签字段内。
同样地,我们可以使用其他的 SoupStrainer
对象,从 HTML 标签中解析特定的信息。下面是一些示例:
from bs4 import BeautifulSoup, SoupStrainer
only_a_tags = SoupStrainer("a")
parse_only = SoupStrainer(id=["first", "third", "my_unique_id"])
soup = BeautifulSoup(my_document, "html.parser", parse_only=parse_only)
def is_short_string(string):
return len(string) < 10
only_short_strings = SoupStrainer(string=is_short_string)
SoupStrainer
类接受与树搜索方法相同的参数:name, attrs, text 和 **kwargs。
注意,如果使用的是 html5lib 解析器,则此功能将不起作用,因为在这种情况下,无论什么情况都会解析整个文档。因此,你应该使用内置的 html.parser
或者 lxml
解析器。
你也可以将 SoupStrainer
传递给树搜索方法中的任何一个。
from bs4 import SoupStrainer
a_tags = SoupStrainer("a")
soup = BeautifulSoup(html_doc, 'html.parser')
soup.find_all(a_tags)