Beautifulsoup - NextSibling

Я пытаюсь получить содержимое «Мой домашний адрес», используя следующее, но получил AttributeError:

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

Это мой HTML:

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

Каков хороший способ перейти вниз по тегу td и извлечь содержимое?


person ready    schedule 14.05.2011    source источник


Ответы (4)


Проблема в том, что вы нашли 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 постоянно находит следующий элемент как проанализированный, пока он не совпадет.

person Henry    schedule 14.05.2011

Попробуйте это, если вы используете bs4:

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

Я не знаю, было ли это возможно в 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>.

person Stefan Falk    schedule 10.02.2021

Вы можете использовать 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
person zeekay    schedule 14.05.2011
comment
Там много столов, поэтому поиск столов, а затем td не выглядит хорошим выбором. - person ready; 14.05.2011