web-dev-qa-db-fra.com

BeautifulSoup: AttributeError: l'objet 'NavigableString' n'a pas d'attribut 'nom'

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.

19
Zeynel

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

20
MattoTodd

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)
7
Max Malysh

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
7
Tomarinator