Schöne Suppe - Fehlerbehebung

Fehlerbehandlung

Es gibt zwei Hauptarten von Fehlern, die in BeautifulSoup behandelt werden müssen. Diese beiden Fehler stammen nicht aus Ihrem Skript, sondern aus der Struktur des Snippets, da die BeautifulSoup-API einen Fehler auslöst.

Die zwei Hauptfehler sind wie folgt:

AttributeError

Dies wird verursacht, wenn die Punktnotation kein Geschwister-Tag für das aktuelle HTML-Tag findet. Möglicherweise ist dieser Fehler aufgetreten, da der Kostenschlüssel aufgrund des fehlenden „Ankertags“ beim Durchlaufen einen Fehler auslöst und ein Ankertag erfordert.

KeyError

Dieser Fehler tritt auf, wenn das erforderliche HTML-Tag-Attribut fehlt. Wenn wir beispielsweise kein Daten-PID-Attribut in einem Snippet haben, löst der PID-Schlüssel einen Schlüsselfehler aus.

Um die beiden oben aufgeführten Fehler beim Parsen eines Ergebnisses zu vermeiden, wird dieses Ergebnis umgangen, um sicherzustellen, dass kein fehlerhaftes Snippet in die Datenbanken eingefügt wird.

except(AttributeError, KeyError) as er:
pass

diagnostizieren()

Wenn wir Schwierigkeiten haben zu verstehen, was BeautifulSoup mit unserem Dokument oder HTML macht, übergeben Sie es einfach an die Funktion diagnostose (). Wenn Sie die Dokumentdatei an die Funktion diagnostose () übergeben, können Sie zeigen, wie die Liste der verschiedenen Parser mit dem Dokument umgeht.

Im Folgenden finden Sie ein Beispiel zur Veranschaulichung der Verwendung der Funktion diagnostose ().

from bs4.diagnose import diagnose

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

Ausgabe

Analysefehler

Es gibt zwei Haupttypen von Analysefehlern. Möglicherweise erhalten Sie eine Ausnahme wie HTMLParseError, wenn Sie Ihr Dokument an BeautifulSoup weiterleiten. Möglicherweise erhalten Sie auch ein unerwartetes Ergebnis, bei dem der Analysebaum von BeautifulSoup stark vom erwarteten Ergebnis des Analysedokuments abweicht.

Keiner der Analysefehler wird durch BeautifulSoup verursacht. Dies liegt an dem von uns verwendeten externen Parser (html5lib, lxml), da BeautifulSoup keinen Parser-Code enthält. Eine Möglichkeit, den obigen Analysefehler zu beheben, besteht darin, einen anderen Parser zu verwenden.

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

Der in Python integrierte HTML-Parser verursacht zwei häufigste Analysefehler: HTMLParser.HTMLParserError: fehlerhaftes Start-Tag und HTMLParser.HTMLParserError: Bad-End-Tag. Um dies zu beheben, wird hauptsächlich ein anderer Parser verwendet: lxml oder html5lib.

Eine weitere häufige Art von unerwartetem Verhalten besteht darin, dass Sie kein Tag finden, von dem Sie wissen, dass es sich im Dokument befindet. Wenn Sie jedoch find_all () ausführen, wird [] oder find () None zurückgegeben.

Dies kann daran liegen, dass der in Python integrierte HTML-Parser manchmal Tags überspringt, die er nicht versteht.

XML-Parser-Fehler

Standardmäßig analysiert das BeautifulSoup-Paket die Dokumente als HTML. Es ist jedoch sehr einfach zu verwenden und verarbeitet schlecht geformtes XML mit beautifulsoup4 auf sehr elegante Weise.

Um das Dokument als XML zu analysieren, benötigen Sie einen lxml-Parser und müssen nur die "xml" als zweites Argument an den Beautifulsoup-Konstruktor übergeben.

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

oder

soup = BeautifulSoup(markup, "xml")

Ein häufiger XML-Analysefehler ist -

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

Dies kann vorkommen, wenn bei Verwendung der Funktion find () oder findall () ein Element fehlt oder nicht definiert ist.

Andere Analysefehler

Im Folgenden sind einige der anderen Analysefehler aufgeführt, die wir in diesem Abschnitt behandeln werden.

Umweltproblem

Abgesehen von den oben genannten Analysefehlern können andere Analyseprobleme auftreten, z. B. Umgebungsprobleme, bei denen Ihr Skript möglicherweise in einem Betriebssystem, jedoch nicht in einem anderen Betriebssystem oder in einer virtuellen Umgebung, jedoch nicht in einer anderen virtuellen Umgebung oder möglicherweise nicht funktioniert außerhalb der virtuellen Umgebung. All diese Probleme können darauf zurückzuführen sein, dass in beiden Umgebungen unterschiedliche Parser-Bibliotheken verfügbar sind.

Es wird empfohlen, Ihren Standardparser in Ihrer aktuellen Arbeitsumgebung zu kennen oder zu überprüfen. Sie können den aktuellen Standardparser überprüfen, der für die aktuelle Arbeitsumgebung verfügbar ist, oder die erforderliche Parser-Bibliothek explizit als zweites Argument an den BeautifulSoup-Konstruktor übergeben.

Groß- und Kleinschreibung wird nicht berücksichtigt

Da bei HTML-Tags und -Attributen die Groß- und Kleinschreibung nicht berücksichtigt wird, konvertieren alle drei HTML-Parser Tag- und Attributnamen in Kleinbuchstaben. Wenn Sie jedoch Tags und Attribute in Groß- oder Kleinschreibung beibehalten möchten, ist es besser, das Dokument als XML zu analysieren.

UnicodeEncodeError

Schauen wir uns das folgende Codesegment an -

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

Ausgabe

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

Das obige Problem kann auf zwei Hauptsituationen zurückzuführen sein. Möglicherweise versuchen Sie, ein Unicode-Zeichen auszudrucken, das auf Ihrer Konsole nicht angezeigt werden kann. Zweitens versuchen Sie, in eine Datei zu schreiben, und übergeben ein Unicode-Zeichen, das von Ihrer Standardcodierung nicht unterstützt wird.

Eine Möglichkeit, das obige Problem zu lösen, besteht darin, den Antworttext / das Antwortzeichen vor der Zubereitung der Suppe zu codieren, um das gewünschte Ergebnis zu erzielen.

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

KeyError: [attr]

Dies wird durch den Zugriff auf das Tag ['attr'] verursacht, wenn das betreffende Tag das Attribut attr nicht definiert. Die häufigsten Fehler sind: "KeyError: 'href'" und "KeyError: 'class'". Verwenden Sie tag.get ('attr'), wenn Sie nicht sicher sind, ob attr definiert ist.

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

Sie können auf AttributeError wie folgt stoßen:

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

Der obige Fehler tritt hauptsächlich auf, weil Sie erwartet haben, dass find_all () ein einzelnes Tag oder eine einzelne Zeichenfolge zurückgibt. Oup.find_all gibt jedoch eine Python-Liste von Elementen zurück.

Alles, was Sie tun müssen, ist, die Liste zu durchlaufen und Daten von diesen Elementen abzufangen.