Python.expat ne peut pas analyser le fichier XML avec de mauvais symboles. Comment faire le tour?
-
21-09-2019 - |
Question
Je suis en train d'analyser un fichier XML (données OSM) avec expat, et il y a des lignes avec des caractères Unicode expat ne peut pas analyser:
<tag k="name"
v="абвгдежзиклмнопр�?туфхцчшщьыъ�?ю�?�?БВГДЕЖЗИКЛМ�?ОПРСТУФХЦЧШЩЬЫЪЭЮЯ" />
<tag k="name" v="Cin\x8e? Rex" />
(fichier XML codage dans la ligne d'ouverture est "UTF-8")
Le fichier est assez vieux, et il y a des erreurs doit avoir été. Dans les fichiers modernes, je ne vois pas UTF-8 erreurs, et ils sont analysés très bien. Mais si mon programme rencontre un symbole cassé, que solution puis-je faire? Est-il possible de rejoindre codec bz2 (je parse un fichier compressé) et codec UTF-8 pour ignorer les caractères brisés, ou de les modifier à « ? »?
La solution
Je ne sais pas si « » caractères ont été introduits par la chaîne du copier-coller ici, mais si vous les avez dans les données d'origine, il semble être générateur problème qui a introduit \ uFFFD charactes comme:
"utilisé pour remplacer un caractère entrant dont la valeur est inconnue ou irreprésentable en Unicode "
citied de: http://www.fileformat.info/info/unicode/char/ FFFD / index.htm
Solution? Juste idée de l'extension:
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
ou un tampon d'entrée propre à la place + coin (cas de la séquence partielle à la fin de la mémoire tampon). Je ne me souviens pas si expat python permet d'attribuer gestionnaire d'erreur personnalisé. Ce serait alors plus facile.
Si je nettoyer le vôtre Extrait de « » caractères, il est mis en oeuvre ok. \ Xd1 ne manque pas.
données OSM?