【问题标题】:BeautifulSoup: How to get nested divsBeautifulSoup:如何获取嵌套的 div
【发布时间】:2014-10-29 20:55:11
【问题描述】:

给定以下代码:

<html>
<body>
<div class="category1" id="foo">
      <div class="category2" id="bar">
            <div class="category3">
            </div>
            <div class="category4">
                 <div class="category5"> test
                 </div>
            </div>
      </div>
</div>
</body>
</html>

如何使用 BeautifulSoup 从&lt;div class="category5"&gt; test 中提取单词test,即如何处理嵌套的 div?我试图在 Internet 上查找,但我没有找到任何处理易于掌握的示例的案例,所以我设置了这个。谢谢。

【问题讨论】:

  • 嵌套 div 怎么样?您要提取什么,为什么嵌套的 div 会阻碍实现该目标?您可以只搜索那些特定的 div,无论是否嵌套。
  • @MartijnPieters 我认为问题在于 div 相互嵌套,因为当我 mysoup.findAll('div', attrs={'class':'category5'})返回值为无!
  • @Andy 这不是重复阅读您也链接我们的其他问题。这里我们使用 attrs={...} 当你有一个像 这样的纯标签时,解决方案是不同的
  • @torr:不,如果您无法通过该搜索找到 div,那么它树中不存在

标签: python web-scraping beautifulsoup


【解决方案1】:

xpath 应该是直截了当的答案,但 BeautifulSoup 不支持。

更新:使用 BeautifulSoup 解决方案

为此,假设您知道本例中的 class 和元素 (div),您可以使用 for/loopattrs 来获得什么你想要:

from bs4 import BeautifulSoup

html = '''
<html>
<body>
<div class="category1" id="foo">
      <div class="category2" id="bar">
            <div class="category3">
            </div>
            <div class="category4">
                 <div class="category5"> test
                 </div>
            </div>
      </div>
</div>
</body>
</html>'''

content = BeautifulSoup(html)

for div in content.findAll('div', attrs={'class':'category5'}):
    print div.text

test

我从您的 html 示例中提取文本没有问题,就像 @MartijnPieters 建议的那样,您需要找出您的 div 元素丢失的原因。

另一个更新

由于您缺少 lxml 作为 BeautifulSoup 的解析器,这就是返回 None 的原因,因为您没有解析任何内容。安装lxml 应该可以解决您的问题。

您可以考虑使用支持 xpathlxml 或类似的工具,如果您问我,这很容易。

from lxml import etree

tree = etree.fromstring(html) # or etree.parse from source
tree.xpath('.//div[@class="category5"]/text()')
[' test\n                 ']

【讨论】:

  • @MartijnPieters,我了解 OP 状态 BeautifulSoup,但没有提及是否会接受另一个库。我也可以编辑并添加使用BeautifulSoup 的解决方案。
  • 问题是 div 解析树中不存在。为什么这是无法回答的,因为 OP 没有向我们提供诊断所需的详细信息。认为它与嵌套有关的假设是错误的。
  • @MartijnPieters,你说得对。 OP 混淆了嵌套元素,而显然所需的技术是添加 attrs 以将给定的 div 元素与类 category5 匹配。答案已更新。
  • 我有一个type object 'BeautifulSoup' has no attribute 'RobustHTMLParser' 也不应该是from bs4 import BeautifulSoup 吗?感谢您的帮助
  • @torr,哈哈,好吧!所以这是你从那时起解析的源代码;)很高兴你解决了这个问题。
猜你喜欢
相关资源
最近更新 更多
热门标签