Alternative XML-parser für ElementTree zu erleichtern UTF-8 leiden?
Ich bin Parsen von XML mit der elementtree.parse () - Funktion. Es funktioniert, außer für einige utf-8-Zeichen(single-byte-Zeichen über 128). Ich sehe, dass der Standard-parser ist XMLTreeBuilder basierend auf expat.
Gibt es eine alternative-parser, die ich verwenden können, die möglicherweise weniger streng und erlauben utf-8-Zeichen?
Dies ist der Fehler, ich bin immer mit dem default-parser:
ExpatError: not well-formed (invalid token): line 311, column 190
Den Charakter verursacht, dies ist ein Einzel-byte-x92 (in hex). Ich bin nicht sicher, dies ist auch eine gültige utf-8 Zeichen. Aber es wäre schön, es zu handhaben, weil die meisten text-Editoren dies zeigen: í
BEARBEITEN: Der Kontext des Zeichens ist: nicht , wo ich annehme, es soll eine Lust apostraphe, aber in den hex-editor, dass die gleiche Sequenz: 63 61 6E 92 74
Du musst angemeldet sein, um einen Kommentar abzugeben.
Starten werde ich aus der Frage: "gibt es eine alternative-parser, die ich verwenden können, die möglicherweise weniger streng und erlauben utf-8-Zeichen?"
Alle XML-Parser akzeptieren Daten in UTF-8 codiert. In der Tat, UTF-8 ist die Standardkodierung.
Einem XML-Dokument kann mit einer Erklärung wie dieser:
oder so:
<?xml version="1.0"?>
oder nicht haben eine Erklärung an alle ... in jedem Fall wird der parser entschlüsselt das Dokument mit UTF-8.
Jedoch Ihre Daten NICHT in UTF-8 codiert ... es ist vermutlich Windows-1252 aka cp1252.
Wenn die Kodierung nicht auf UTF-8, dann ist entweder der Schöpfer sollte auch eine Erklärung (oder der Empfänger kann sich voranstellen) oder der Empfänger kann die umcodierung der Daten zu UTF-8. Die folgenden Vitrinen, was funktioniert und was nicht:
Sieht es aus wie Sie haben CP1252 text. Wenn dem so ist, sollte angegeben werden, an den Anfang der Datei, wie zB.:
Dies funktioniert mit ElementTree.
Wenn Sie diese Dateien selbst schreiben nicht, Sie in dieser Codierung. Sparen Sie als UTF-8 und Ihren Teil tun, um zu helfen töten veralteten encodings.
Wenn Sie empfangen CP1252 Daten mit keine codierspezifikation, und Sie wissen sicher, dass es immer CP1252, können Sie einfach konvertieren Sie Sie in UTF-8 vor dem senden an den parser:
0x92 Byte ist nie gültig, da die erste byte einer UTF-8-Zeichen. Es kann sein, gelten nachfolgende byte, jedoch. Sehen diese UTF-8-Anleitung für eine Tabelle der gültigen byte-Sequenzen.
Könnten Sie uns eine Vorstellung davon, welche bytes sind um 0x92? Funktioniert die XML-Deklaration enthalten ein Zeichensatz?
Ah. Das ist "kippe", offensichtlich, und in der Tat, 0x92 ist ein Apostroph, der in vielen Windows-code-pages. Ihr Redakteur meint stattdessen, dass es eine Mac-Datei. 😉
Wenn es ein one-off, Befestigung der Datei ist die richtige Sache zu tun. Aber fast immer, wenn Sie brauchen, um den import anderer Völker XML es gibt eine Menge Dinge, die einfach nicht einverstanden sind mit der angegebenen Kodierung. Ich habe festgestellt, dass die beste Lösung ist, um zu entschlüsseln, mit error-Einstellung 'xmlcharrefreplace', und in schweren Fällen machen Sie Ihre eigenen benutzerdefinierten Zeichen ersetzt und behebt die häufigsten Probleme, die für diesen bestimmten Kunden.
Werde ich auch empfehlen lxml als XML-Bibliothek in Python, aber das ist nicht das problem hier.