Beautifulsoup - nextSibling

Posted

技术标签:

【中文标题】Beautifulsoup - nextSibling【英文标题】: 【发布时间】:2011-08-25 09:05:18 【问题描述】:

我正在尝试使用以下内容获取内容“我的家庭住址”,但得到了 AttributeError:

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

这是我的 html

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

向下导航td标签并拉取内容的好方法是什么?

【问题讨论】:

【参考方案1】:

问题是您找到了NavigableString,而不是&lt;td&gt;nextSibling 也会找到下一个 NavigableString Tag 所以即使你有 &lt;td&gt; 它也不会像你期望的那样工作。

这就是你想要的:

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 会重复按解析找到下一个元素,直到匹配为止。

【讨论】:

【参考方案2】:

假设它在表中,您可以很容易地使用findChildren 迭代表中的 td。理想情况下,您可以先找到该表:

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 看起来不是一个好选择。【参考方案3】:

如果你使用 bs4 试试这个:

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

【讨论】:

【参考方案4】:

我不知道这在 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>

你最终会得到&lt;div&gt;THE PROBLEM&lt;/div&gt; 而不是&lt;div&gt;target&lt;/div&gt;

【讨论】:

以上是关于Beautifulsoup - nextSibling的主要内容,如果未能解决你的问题,请参考以下文章

node.nextSibling 和 ChildNode.nextElementSibling 有啥区别?

调用 jQuery next() 不返回 nextSibling 对象

js:nextSibling兄弟节点的使用

IE10Chrome与nextSibling

csharp NextSibling

js nextSibling属性和previousSibling属性概述及使用注意