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

Seb*_*ian 3 beautifulsoup python-3.x

我想找到div与使用beautifulsoup解析的网页中的元素相关联的文本.

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"}))

[]
Run Code Online (Sandbox Code Playgroud)

那里显然有一个div.为什么不找到它?

J. *_*lor 5

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

该Tag.find_all()方法只搜索后人的Tag,其name给定的参数相匹配.所以在你的情况下,它返回一个空列表,因为没有后代<divs>.Tag您共享的示例的唯一后代是<a>标记,a <span>和几个实例NavigableString(bs4用于表示DOM树中可见文本的对象).如果你想在你的例子中使用它find_all()来返回它<div>,你必须从父节点Tag(或者更确切地说,从目标<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') 
Run Code Online (Sandbox Code Playgroud)

...然后元素将被返回,因为它是soup(html docroot)的后代.

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

  • 如果你想获得`<li>`中包含的所有文本而不是后代中的文本,你可以使用:`listitem_text = li.find_all(text = True,recursive = False)`where li `是表示目标`<li>`的`bs4.Tag`对象.这将返回`<li>`中包含的字符串列表.如果你只想要`<a>`标签之前的日期,你就可以执行`listitem_text [0]`来只检索第一个字符串(这是日期). (2认同)
  • ^我想要注意这可能看起来很奇怪,因为我只是说`find_all()`只搜索后代,而我似乎在这里用它来搜索Tag本身.但是,在这种情况下,`text = True`告诉它在元素中搜索`NavigableString`的实例(这是BeautifulSoup用来表示HTML文档中所有明文字符串的类),这些字符串在技术上是儿童`<li>`元素. (2认同)