使用BeautifulSoup选择特定子元素
我正在学习使用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))