使用BeautifulSoup选择特定子元素

2 投票
1 回答
6506 浏览
提问于 2025-04-15 15:05

我正在学习使用BeautifulSoup来抓取一些比较复杂的HTML页面。在查看BeautifulSoup的文档时,我发现选择子元素的方式似乎不太简单。

假设有这样的HTML:

<div id="top">
  <div>Content</div>
  <div>
    <div>Content I Want</div>
  </div>
</div>

我想要一个简单的方法来获取“我想要的内容”,前提是我已经有了一个叫做top的对象。我以为在BeautifulSoup中这会很简单,比如可以用topobj.nodes[1].nodes[0].string这样的方式。但实际上我看到的都是一些变量和函数,它们返回的元素还包括文本节点、注释等等。

我是不是漏掉了什么?难道我真的需要使用.find()这样比较繁琐的方法,或者更糟糕的是在.contents变量上使用列表推导式吗?

原因是我不太相信网页中的空白符会保持一致,所以我想忽略这些,只关注元素本身。

1 个回答

2

使用 find 让你更灵活,只需要运行以下代码就能得到你想要的结果:

node = p.find('div', text="Content I Want")

不过,这可能不是你想要的方式,下面的选项可能更适合你:

xml = """<div id="top"><div>Content</div><div><div>Content I Want</div></div></div>"""
from BeautifulSoup import BeautifulSoup
p = BeautifulSoup(xml)

# returns a list of texts
print p.div.div.findNextSibling().div.contents
# returns a list of texts
print p.div.div.findNextSibling().div(text=True)
# join (and strip) the values
print ''.join(s.strip() for s in p.div.div.findNextSibling().div(text=True))

撰写回答