it-swarm.com.de

Beautifulsoup - nextSibling

Ich versuche, den Inhalt "Meine Privatadresse" mit dem folgenden Befehl abzurufen, habe aber den AttributeError:

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

Das ist mein HTML:

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

Was ist ein guter Weg, um das td -Tag nach unten zu navigieren und den Inhalt abzurufen?

33
ready

Das Problem ist, dass Sie ein NavigableString gefunden haben, nicht das <td>. Auch nextSibling findet den nächsten NavigableStringoderTag, selbst wenn Sie den <td> es würde nicht so funktionieren, wie Sie es erwarten.

Das ist, was du willst:

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]

Oder prägnanter:

print soup.find(text="Address:").parent.parent.findNext('td').contents[0]

Eigentlich könnte man das einfach machen

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

Da findNext nur immer wieder next aufruft und next das nächste Element wie analysiert wiederholt findet, bis es übereinstimmt.

73
Henry

Versuchen Sie dies, wenn Sie bs4 verwenden:

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

Sie können findChildren ziemlich einfach verwenden, um die tds in einer Tabelle zu durchlaufen, vorausgesetzt, sie befinden sich in einer Tabelle. Sie könnten die Tabelle zuerst finden, idealerweise:

table = soup.find('table')
>>> for td in table.findChildren('td'):
...:     print td.text
...:     
...:     
Address:
My home address

Oder Sie könnten nach der Adresse suchen und den Tabellencontainer abrufen:

>>> import re
>>> search = re.compile('Address')
>>> table = soup.find(text=search).parent.parent.parent
2
zeekay