我想从经过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。为什么找不到它?
答案 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
属性,该属性提供给定标记及其任何后代的可见文本。