Beautifulsoup - nextSibling

60

我试图使用以下代码获取内容"My home address",但是出现了AttributeError错误:

address = soup.find(text="Address:")
print address.nextSibling

这是我的 HTML:

<td><b>Address:</b></td>
<td>My home address</td>

如何优雅地遍历 td 标签并提取其中的内容?

4个回答

110
问题在于你找到了一个NavigableString,而不是标签。另外,nextSibling方法会找到下一个NavigableString或Tag元素,因此即使你有标签,它也无法按照你的期望工作。
以下是你需要的代码:
address = soup.find(text="Address:")
b_tag = address.parent
td_tag = b_tag.parent
next_td_tag = td_tag.findNext('td')
print next_td_tag.contents[0]

更简洁的写法:

print soup.find(text="Address:").parent.parent.findNext('td').contents[0]

实际上你可以直接这样做

print soup.find(text="Address:").findNext('td').contents[0]

由于findNext只是一遍又一遍地调用next,而next会重复查找直到匹配下一个已解析的元素。


20

如果你使用bs4,请尝试以下方法:

print soup.find(string="Address:").find_next('td').contents[0]

14

我不知道在2011年是否可能,但在2021年我建议您使用find_next_sibling()来执行此操作:

address = soup.find(text="Address:")
b = address.parent
address_td = b.parent
target_td = address_td.find_next_sibling('td')

接受的答案在您的情况下有效,但如果您有类似以下内容的东西,则无法起作用:

<div>
  <div><b>Address:</b><div>THE PROBLEM</div></div>
  <div>target</div>
</div>

如果这样做,你最终会得到<div>THE PROBLEM</div>而不是<div>target</div>


3

假设表格已经存在,您可以很容易地使用findChildren来遍历表格中的。最好先找到表格:

table = soup.find('table')
>>> for td in table.findChildren('td'):
...:     print td.text
...:     
...:     
Address:
My home address

或者您可以搜索地址并获取表格容器:

>>> import re
>>> search = re.compile('Address')
>>> table = soup.find(text=search).parent.parent.parent

有很多表格,所以查找表格然后 td 不是一个好选择。 - ready

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接