Beautifulsoup - nextSibling
Я пытаюсь получить контент "Мой домашний адрес", используя следующее, но получил 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
Попробуйте это, если вы используете bs4:
print soup.find(string="Address:").find_next('td').contents[0]
Ответ 3
Вы можете легко использовать 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