Python.expat kann nicht Parse XML-Datei mit schlechten Symbolen. Wie zu umgehen?
-
21-09-2019 - |
Frage
Ich versuche, eine XML-Datei (OSM-Daten) mit Expat zu analysieren, und es gibt Zeilen mit einigen Unicode-Zeichen, dass Expat kann nicht analysieren:
<tag k="name"
v="абвгдежзиклмнопр�?туфхцчшщьыъ�?ю�?�?БВГДЕЖЗИКЛМ�?ОПРСТУФХЦЧШЩЬЫЪЭЮЯ" />
<tag k="name" v="Cin\x8e? Rex" />
(XML-Datei-Codierung in der ersten Zeile ist "UTF-8")
Die Datei ist ziemlich alt, und es müssen Fehler gewesen sein. In modernen Dateien sehe ich nicht UTF-8 Fehler, und sie sind geparsten in Ordnung. Aber was, wenn mein Programm ein gebrochenes Symbol trifft, welche Abhilfe kann ich machen? Ist es möglich, verbinden bz2 Codec (ich eine komprimierte Datei parsen) und utf-8-Codec die gebrochenen Zeichen zu ignorieren, oder sie ändern zu „?“?
Lösung
Nicht sicher, ob ‚‘ Zeichen von copy-Einfügen-String eingeführt wurden hier, aber wenn man sie in Originaldaten hat, dann scheint es, Generator zu sein Problem, das \ uFFFD charactes eingeführt wie:
"verwendet, um einen eingehenden Zeichen, dessen Wert zu ersetzen, ist nicht bekannt, oder unrepresentable in Unicode "
citied aus: http://www.fileformat.info/info/unicode/char/ FFFD / index.htm
Abhilfe? Nur Idee für die Erweiterung:
good = True
buf = None
while True:
if good:
buf = f.read(buf_size)
else:
# try again with cleaned buffer
pass
try:
xp.Parse(buf, len(buf) == 0)
if (len(buf) == 0):
break
good = True
except ExpatError:
if xp.ErrorCode == XML_ERROR_BAD_CHAR_REF:
# look at ErrorByteIndex (or nearby)
# for 0xEF 0xBF 0xBD (UTF8 replacement char) and remove it
good = False
else:
# other errors processing
pass
oder saubere Eingangspuffer statt + Eckfällen (Teilsequenz am Pufferende). Ich kann mich nicht erinnern, ob Python Expat ermöglicht assign eine benutzerdefinierte Fehlerbehandlung. Das wäre dann leichter.
Wenn ich sauber Ihre Probe von ‚‘ Zeichen ist es ok verarbeitet. \ Xd1 nicht fehlschlagen.
OSM-Daten?