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
,而不是<td>
。 nextSibling
也会找到下一个 NavigableString
或 Tag
所以即使你有 <td>
它也不会像你期望的那样工作。
这就是你想要的:
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>
你最终会得到<div>THE PROBLEM</div>
而不是<div>target</div>
。
【讨论】:
以上是关于Beautifulsoup - nextSibling的主要内容,如果未能解决你的问题,请参考以下文章
node.nextSibling 和 ChildNode.nextElementSibling 有啥区别?