Beautifulsoup - nextSibling

时间:2011-05-14 04:09:35

标签: python beautifulsoup

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

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

这是我的HTML:

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

向下导航td代码并提取内容的好方法是什么?

4 个答案:

答案 0 :(得分:69)

问题是您找到了NavigableString,而不是<td>。另外nextSibling会找到下一个NavigableString Tag,所以即使您拥有<td>,它也无法按照预期的方式运行。< / p>

这就是你想要的:

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一遍又一遍地调用nextnext会反复找到下一个解析元素,直到匹配为止。

答案 1 :(得分:10)

如果您使用bs4:

,请尝试此操作
print soup.find(string="Address:").find_next('td').contents[0]

答案 2 :(得分:3)

我不知道这在 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 :(得分: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