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?
Le problème est que vous avez trouvé un NavigableString
, pas le <td>
. nextSibling
trouvera également le NavigableString
oTag
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.
Essayez ceci si vous utilisez bs4:
print soup.find(string="Address:").find_next('td').contents[0]
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