为什么find_all无法找到明显存在的`div`元素?

时间:2019-02-09 03:01:27

标签: python-3.x beautifulsoup

我想从经过beautifulsoup解析的网页中找到与div元素相关的文本。

print(searchResult)

<div id="results-from-CIDR"><a href="javascript:prefixContribsToggleAll();" id="prefixcontribs-tog">toggle all</a><span id="prefixcontribs-prog">Searching.</span> No changes were found for this wildcard/CIDR range.</div>

print(type(searchResult))

<class 'bs4.element.Tag'>

print(searchResult.find_all("div"))

[]

print(searchResult.find_all("div", attrs={"id":"results-from-CIDR"}))

[]

这里显然有一个div。为什么找不到它?

1 个答案:

答案 0 :(得分:5)

如果您只是在查找div的纯文本/可见文本,而没有任何标记,则可以通过searchResult.text属性访问此文本。

Tag.find_all()方法仅搜索Tag与给定参数匹配的name 后代 。因此,在您的情况下,由于没有后代<divs>,它将返回一个空列表。您共享的示例Tag的唯一后代是一个<a>标签,一个<span>和几个NavigableString实例(bs4对象用来表示DOM树中的可见文本)。如果要在示例中使用find_all()返回<div>,则必须从父级Tag(或更确切地说,从目标{{1 }}是)的后代。

例如,如果您这样做:

<div>

...,然后将返回元素 ,因为它是from bs4 import BeautifulSoup as Soup soup = Soup('<html><body><div id="results-from-CIDR"><a href="javascript:prefixContribsToggleAll();" id="prefixcontribs-tog">toggle all</a><span id="prefixcontribs-prog">Searching.</span> No changes were found for this wildcard/CIDR range.</div></body></html>') soup.findall('div') (html docroot)的后代。

同样,如果您只是尝试提取文本,请使用soup属性,该属性提供给定标记及其任何后代的可见文本。