Beautifulsoup-nextSibling

j'essaie d'obtenir le contenu "My home address" En utilisant ce qui suit mais j'ai l'AttributeError:

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


    <td><b>Address:</b></td>

    <td>My home address</td>

Quelle est une bonne façon de naviguer dans l'étiquette td et de tirer le contenu?

25
demandé sur zeekay 2011-05-14 08:09:35

3 réponses

le problème est que vous avez trouvé un NavigableString, pas <td>. Aussi nextSibling va trouver la prochaine NavigableStringouTag donc même si vous aviez le <td> ça ne marcherait pas comme vous le pensez.

C'est 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 juste faire

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

Depuis findNext appelle next encore et encore, et next trouve l'élément suivant comme analysée à plusieurs reprises jusqu'à ce qu'elle corresponde.

58
répondu Henry 2011-05-14 08:56:06

Essayez ceci si vous utilisez bs4:

print soup.find(string="Address:").find_next('td').contents[0]
3
répondu Vyachez 2018-02-11 18:02:06

Vous pouvez utiliser findChildren assez facilement pour itérer sur les td dans une table, en supposant qu'il est dans une table. Vous pouvez trouver la table 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 des adresses, et d'obtenir la table contenant:

>>> import re
>>> search = re.compile('Address')
>>> table = soup.find(text=search).parent.parent.parent
2
répondu zeekay 2011-05-14 04:27:16