Wie richtig analysiert, utf-8 xml mit ElementTree?
Ich brauche Hilfe um zu verstehen, warum das Parsen meiner xml-Datei* mit xml.etree.ElementTree produziert den folgenden Fehler.
*Meine test xml-Datei enthält Arabische Zeichen.
Aufgabe:
Öffnen und analysieren utf8_file.xml
Datei.
Mein Erster Versuch:
import xml.etree.ElementTree as etree
with codecs.open('utf8_file.xml', 'r', encoding='utf-8') as utf8_file:
xml_tree = etree.parse(utf8_file)
Ergebnis 1:
UnicodeEncodeError: 'ascii' codec can't encode characters in position 236-238: ordinal not in range(128)
Mein zweiter Versuch:
import xml.etree.ElementTree as etree
with codecs.open('utf8_file.xml', 'r', encoding='utf-8') as utf8_file:
xml_string = etree.tostring(utf8_file, encoding='utf-8', method='xml')
xml_tree = etree.fromstring(xml_string)
Ergebnis 2:
AttributeError: 'file' object has no attribute 'getiterator'
Bitte erläutern Sie den Fehler oben und Kommentar auf die mögliche Lösung.
InformationsquelleAutor minerals | 2014-02-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verlassen Dekodierung der bytes an, die der parser; nicht decodieren erste:
Einer XML-Datei muss genügend Informationen enthalten, in Erster Linie zu behandeln Dekodierung durch den parser. Wenn der header fehlt, kann der parser davon ausgehen müssen UTF-8 verwendet wird.
Weil es der XML-header, der hält diese Informationen, ist es die Aufgabe des parsers, alles zu tun, Dekodierung.
Ihrem ersten Versuch fehlgeschlagen ist, weil Python versucht hatte, Sie zu Kodieren die Unicode-Werte wieder, so dass der parser konnte Griff byte-Zeichenfolgen, wie es erwartet wird. Der zweite Versuch scheiterte, weil
etree.tostring()
erwartet geparst Baum als erstes argument, nicht eine unicode-Zeichenfolge.UTF-8 ohne BOM, ist der standard; mit Stückliste ist meist Microsoft wollen es einfacher machen, zu erkennen 8-bit-Kodierungen als UTF-8.
etree.parse(a_file)
Griffe standardmäßig im Unicode-Format. Allerdingsetree.fromstring(a_string)
nicht bis Python 3.x (siehe bugs.python.org/issue11033), so, eine Zeichenfolge zu analysieren, müssen Sie Sie verschlüsseln, manuell, wieetree.fromstring(a_string.encode('utf-8'))
.Diese Frage ist über Python 2, wo die Datei Objekte erzeugen byte-strings, die nicht in Unicode. Die Frage bezieht sich auf die Benutzer-Lesen von Daten aus einer Datei und manuelles decodieren, das ist völlig sinnlos.
Ich bin damit einverstanden. Dieser Kommentar soll darauf hinweisen, eine nicht-offensichtliche Verhaltens für alle, die sich in den string-basierten Ansatz. Es ist nicht offensichtlich, dass die Datei-basierte Methode, Griffe kodiert, aber die string-basierte Methode erfordert pre-Codierung.
InformationsquelleAutor Martijn Pieters