web-dev-qa-db-fra.com

Beautifulsoup - nextSibling

J'essaie d'obtenir le contenu "Mon adresse personnelle" en utilisant ce qui suit, mais j'ai obtenu l'attributError:

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

Voici mon HTML:

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

Quelle est la bonne façon de naviguer dans la balise td et de tirer le contenu?

33
ready

Le problème est que vous avez trouvé un NavigableString, pas le <td>. nextSibling trouvera également le NavigableStringoTag suivant, même si vous aviez le <td> cela ne fonctionnerait pas comme vous vous y attendez.

Voici ce que vous voulez:

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]

Ou plus concis:

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

En fait, vous pourriez simplement faire

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

Puisque findNext appelle simplement next maintes et maintes fois, et next trouve l'élément suivant tel que analysé à plusieurs reprises jusqu'à ce qu'il corresponde.

73
Henry

Essayez ceci si vous utilisez bs4:

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

Vous pouvez utiliser findChildren assez facilement pour parcourir les td d'une table, en supposant que ce soit dans une table. Vous pouvez trouver le tableau en premier, idéalement:

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

Ou vous pouvez rechercher une adresse et obtenir le conteneur de table:

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