Savez-vous pourquoi le premier exemple du tutoriel BeautifulSoup http://www.crummy.com/software/BeautifulSoup/documentation.html#QuickStart donne AttributeError: 'NavigableString' object has no attribute 'name'
? Selon cette réponse les caractères d'espace dans le HTML provoquent le problème. J'ai essayé avec des sources de quelques pages et j'ai travaillé les autres ont donné la même erreur (j'ai supprimé les espaces). Pouvez-vous expliquer à quoi fait référence "nom" et pourquoi cette erreur se produit? Merci.
name
fera référence au nom de la balise si l'objet est un objet Tag
(ie: <html>
name = "html")
si vous avez des espaces dans votre balisage entre les nœuds, BeautifulSoup les transformera en NavigableString
. Donc, si vous utilisez l'index du contents
pour récupérer les nœuds, vous pouvez saisir un NavigableString
au lieu du Tag
suivant.
Pour éviter cela, recherchez le nœud que vous recherchez: Recherche dans l'arbre d'analyse
ou si vous connaissez le nom de la prochaine balise que vous souhaitez, vous pouvez utiliser ce nom comme propriété et elle renverra le premier Tag
avec ce nom ou None
si aucun enfant avec ce nom existe: tilisation de noms de balises comme membres
Si vous voulez utiliser le contents
, vous devez vérifier les objets avec lesquels vous travaillez. L'erreur que vous obtenez signifie simplement que vous essayez d'accéder à la propriété name car le code suppose qu'il s'agit d'un Tag
Ignorez simplement les objets NavigableString
lors de l'itération dans l'arborescence:
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')
for body_child in soup.body.children:
if isinstance(body_child, NavigableString):
continue
if isinstance(body_child, Tag):
print(body_child.name)
Vous pouvez utiliser try catch pour éliminer les cas où la chaîne navigable est analysée dans la boucle, comme ceci:
for j in soup.find_all(...)
try:
print j.find(...)
except NavigableString:
pass