Belle soupe - Dépannage

La gestion des erreurs

Il existe deux principaux types d'erreurs qui doivent être traitées dans BeautifulSoup. Ces deux erreurs ne proviennent pas de votre script mais de la structure de l'extrait de code car l'API BeautifulSoup génère une erreur.

Les deux principales erreurs sont les suivantes -

AttributeError

Cela se produit lorsque la notation par points ne trouve pas de balise sœur dans la balise HTML actuelle. Par exemple, vous avez peut-être rencontré cette erreur, en raison de l'absence de «balise d'ancrage», cost-key lancera une erreur lors de sa traversée et nécessite une balise d'ancrage.

KeyError

Cette erreur se produit si l'attribut de balise HTML requis est manquant. Par exemple, si nous n'avons pas d'attribut data-pid dans un extrait de code, la clé pid lancera une erreur de clé.

Pour éviter les deux erreurs répertoriées ci-dessus lors de l'analyse d'un résultat, ce résultat sera contourné pour s'assurer qu'un extrait de code mal formé n'est pas inséré dans les bases de données -

except(AttributeError, KeyError) as er:
pass

diagnostiquer()

Chaque fois que nous rencontrons des difficultés à comprendre ce que fait BeautifulSoup à notre document ou HTML, transmettez-le simplement à la fonction diagnose (). En passant le fichier de document à la fonction diagnose (), nous pouvons montrer comment la liste des différents analyseurs gère le document.

Voici un exemple pour illustrer l'utilisation de la fonction diagnose () -

from bs4.diagnose import diagnose

with open("20 Books.html",encoding="utf8") as fp:
   data = fp.read()
   
diagnose(data)

Production

Erreur d'analyse

Il existe deux principaux types d'erreurs d'analyse. Vous pouvez obtenir une exception comme HTMLParseError, lorsque vous transmettez votre document à BeautifulSoup. Vous pouvez également obtenir un résultat inattendu, où l'arborescence d'analyse de BeautifulSoup est très différente du résultat attendu du document d'analyse.

Aucune des erreurs d'analyse n'est due à BeautifulSoup. C'est à cause de l'analyseur externe que nous utilisons (html5lib, lxml) puisque BeautifulSoup ne contient aucun code d'analyseur. Une façon de résoudre l'erreur d'analyse ci-dessus consiste à utiliser un autre analyseur.

from HTMLParser import HTMLParser

try:
   from HTMLParser import HTMLParseError
except ImportError, e:
   # From python 3.5, HTMLParseError is removed. Since it can never be
   # thrown in 3.5, we can just define our own class as a placeholder.
   class HTMLParseError(Exception):
      pass

L'analyseur HTML intégré à Python provoque deux erreurs d'analyse les plus courantes, HTMLParser.HTMLParserError: balise de début malformée et HTMLParser.HTMLParserError: balise de fin incorrecte et pour résoudre cela, il faut utiliser un autre analyseur principalement: lxml ou html5lib.

Un autre type courant de comportement inattendu est que vous ne trouvez pas une balise dont vous savez qu'elle se trouve dans le document. Cependant, lorsque vous exécutez find_all () renvoie [] ou find () renvoie None.

Cela peut être dû au fait que l'analyseur HTML intégré à python ignore parfois les balises qu'il ne comprend pas.

Erreur de l'analyseur XML

Par défaut, le package BeautifulSoup analyse les documents au format HTML, cependant, il est très facile à utiliser et gère le XML mal formé de manière très élégante en utilisant beautifulsoup4.

Pour analyser le document au format XML, vous devez disposer d'un analyseur lxml et il vous suffit de passer le «xml» comme deuxième argument au constructeur Beautifulsoup -

soup = BeautifulSoup(markup, "lxml-xml")

ou

soup = BeautifulSoup(markup, "xml")

Une erreur d'analyse XML courante est -

AttributeError: 'NoneType' object has no attribute 'attrib'

Cela peut se produire dans le cas où un élément manque ou n'est pas défini lors de l'utilisation de la fonction find () ou findall ().

Autres erreurs d'analyse

Vous trouverez ci-dessous quelques-unes des autres erreurs d'analyse que nous allons discuter dans cette section -

Problème environnemental

Outre les erreurs d'analyse mentionnées ci-dessus, vous pouvez rencontrer d'autres problèmes d'analyse tels que des problèmes environnementaux où votre script peut fonctionner dans un système d'exploitation mais pas dans un autre système d'exploitation ou peut fonctionner dans un environnement virtuel mais pas dans un autre environnement virtuel ou peut ne pas fonctionner en dehors de l'environnement virtuel. Tous ces problèmes peuvent être dus au fait que les deux environnements ont des bibliothèques d'analyseurs différentes disponibles.

Il est recommandé de connaître ou de vérifier votre analyseur par défaut dans votre environnement de travail actuel. Vous pouvez vérifier l'analyseur par défaut actuel disponible pour l'environnement de travail actuel ou bien transmettre explicitement la bibliothèque d'analyseurs requise en tant que seconds arguments au constructeur BeautifulSoup.

Insensible à la casse

Comme les balises et attributs HTML sont insensibles à la casse, les trois analyseurs HTML convertissent les noms de balises et d'attributs en minuscules. Cependant, si vous souhaitez conserver des balises et des attributs en majuscules ou en majuscules, il est préférable d'analyser le document au format XML.

UnicodeEncodeError

Examinons le segment de code ci-dessous -

soup = BeautifulSoup(response, "html.parser")
   print (soup)

Production

UnicodeEncodeError: 'charmap' codec can't encode character '\u011f'

Le problème ci-dessus peut être dû à deux situations principales. Vous essayez peut-être d'imprimer un caractère Unicode que votre console ne sait pas afficher. Deuxièmement, vous essayez d'écrire dans un fichier et vous passez un caractère Unicode qui n'est pas pris en charge par votre encodage par défaut.

Une façon de résoudre le problème ci-dessus est d'encoder le texte / caractère de réponse avant de faire la soupe pour obtenir le résultat souhaité, comme suit -

responseTxt = response.text.encode('UTF-8')

KeyError: [attr]

Cela est dû à l'accès à la balise ['attr'] lorsque la balise en question ne définit pas l'attribut attr. Les erreurs les plus courantes sont: «KeyError: 'href'» et «KeyError: 'class'». Utilisez tag.get ('attr') si vous n'êtes pas sûr que attr est défini.

for item in soup.fetch('a'):
   try:
      if (item['href'].startswith('/') or "tutorialspoint" in item['href']):
      (...)
   except KeyError:
      pass # or some other fallback action

AttributeError

Vous pouvez rencontrer AttributeError comme suit -

AttributeError: 'list' object has no attribute 'find_all'

L'erreur ci-dessus se produit principalement parce que vous vous attendiez à ce que find_all () renvoie une seule balise ou chaîne. Cependant, soup.find_all renvoie une liste d'éléments python.

Tout ce que vous avez à faire est de parcourir la liste et de récupérer les données de ces éléments.