Ich versuche, endlich einige Probleme mit der Codierung zu lösen, die beim Versuch, HTML mit lxml zu scrappen, auftauchen. Hier sind drei Beispiel-HTML-Dokumente, denen ich begegnet bin:
1.
%Vor%2.
%Vor%3.
%Vor%Mein grundlegendes Skript:
%Vor%Die Ergebnisse sind:
%Vor% Also offensichtlich ein Problem mit Beispiel 1 und dem fehlenden <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-Tag. Die Lösung von hier erkennt Probe 1 korrekt als utf-8 und so ist es funktionell äquivalent zu meinem ursprünglichen Code.
Die lxml-Dokumente scheinen widersprüchlich zu sein:
Von hier scheint das Beispiel darauf hinzuweisen, dass wir UnicodeDammit verwenden sollten, um das Markup zu kodieren als Unicode.
%Vor%Jedoch hier heißt es:
[Y] ou erhalten Fehler, wenn Sie versuchen, HTML-Daten in einer Unicode-Zeichenfolge zu analysieren, die einen Zeichensatz in einem Meta-Tag der Kopfzeile angibt. Sie sollten im Allgemeinen vermeiden, XML / HTML-Daten in Unicode zu konvertieren, bevor Sie sie an die Parser übergeben. Es ist sowohl langsamer als auch fehleranfällig.
Wenn ich versuche, dem ersten Vorschlag in den lxml-Dokumenten zu folgen, lautet mein Code nun:
%Vor%Ich bekomme jetzt folgende Ergebnisse:
%Vor% Beispiel 1 funktioniert nun korrekt, aber Beispiel 3 führt aufgrund des <?xml version="1.0" encoding="utf-8"?>
-Tags zu einem Fehler.
Gibt es einen richtigen Weg, um all diese Fälle zu behandeln? Gibt es eine bessere Lösung als die folgenden?
%Vor% Das Problem rührt vermutlich daher, dass <meta charset>
ein relativ neuer Standard ist (HTML5, wenn ich mich nicht irre oder es vorher nicht wirklich benutzt wurde.)
Bis zu dem Zeitpunkt, an dem die Bibliothek lxml.html
aktualisiert wird, um sie widerzuspiegeln, müssen Sie diesen Fall speziell behandeln.
Wenn Sie nur an ISO-8859- * und UTF-8 interessiert sind und nicht-ASCII-kompatible Kodierungen (wie UTF-16 oder die traditionellen ostasiatischen Zeichensätze) wegwerfen können, können Sie eine reguläre Ausdrucksersetzung vornehmen Ersetzen Sie in der Bytezeichenfolge das neuere <meta charset>
durch das ältere http-equiv
-Format.
Andernfalls, wenn Sie eine geeignete Lösung benötigen, ist es am besten, die Bibliothek selbst zu patchen (und den Fix beizusteuern, während Sie gerade dabei sind). Sie könnten die lxml-Entwickler fragen, ob sie einen halbfertigen Code haben herumliegen für diesen speziellen Fehler, oder wenn sie den Bug auf ihrem Bug-Tracking-System verfolgen.
Tags und Links python unicode web-scraping lxml beautifulsoup