Python 3.x 为什么find_all找不到明显存在的'div'元素?

Python 3.x 为什么find_all找不到明显存在的'div'元素?,python-3.x,beautifulsoup,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>

我想从使用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"}))

[]
打印(搜索结果)
搜索。未找到此通配符/CIDR范围的更改。
打印(键入(搜索结果))
打印(searchResult.find_all(“div”))
[]
打印(searchResult.find_all(“div”,attrs={“id”:“来自CIDR的结果”}))
[]

那里显然有一个潜水舱。为什么它找不到它?

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

Tag.find_all()
方法仅搜索
Tag
子体,该子体的
name
与给定参数匹配。因此,在您的情况下,它返回一个空列表,因为没有后代
。您共享的示例
标记
的唯一后代是
搜索。未找到此通配符/CIDR范围的任何更改。“)
汤。芬德尔('div')
。。。然后返回元素,因为它是
soup
(html文档根)的后代


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

有时,学习编程语言的人阅读问题是为了通过某种不同的过程来了解更多有关目标语言的信息。有时候,这些人可以找出问题的答案,因为他们来自不同的角度。但要使其正常工作,您需要一个类似于
  • 2018-07-10(删除错误信息)
  • 的文本,我可以在
    a
    元素之前提取文本吗?如果您想获取
  • 中包含的所有文本,而不是子体中的文本,可以使用:
    列表项\u text=li.find\u all(text=True,recursive=False)
    其中
    li
    是表示目标
  • bs4.Tag
    对象。这将返回
  • 中包含的字符串列表。如果您只想要
    标记之前的日期,则只需执行
    列表项\u text[0]
    即可检索第一个字符串(日期)。^我想指出,这可能看起来很奇怪,因为我刚才说
    find_all()
    只搜索子体,而且似乎我在这里使用它来搜索标记本身。但是,在这种情况下,
    text=True
    告诉它搜索
    navigablesting
    (这是BeautifulSoup用来表示HTML文档中所有纯文本字符串的类)也在元素中,从技术上讲,这些字符串是
  • 元素的子元素。@J.Taylor-我知道策略是不鼓励使用注释来表示“谢谢”,但您的回答解释了一些困扰我多年的问题-所以:谢谢!但是(总是有一个but…),在您上面的评论中,您说“从技术上讲,这些字符串是
  • 元素的子元素”-什么?为什么?怎么可能?BS误用了“后代”这个词的简单含义吗或者我遗漏了一些基本概念?对不起,我在那里混合了一些上下文,所以不清楚。我的意思是从BS4(不是HTML/DOM标准)的角度来看,NavigableString
    被认为是
    bs4.Tag
    的子项。实际上,我不确定HTML5标准如何定义标签和标签中的字符串之间的关系(尽管我现在打算停下来读一读!)
    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')