Python.expat ne peut pas analyser le fichier XML avec de mauvais symboles. Comment faire le tour?

StackOverflow https://stackoverflow.com/questions/2495538

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 à « ? »?

Était-ce utile?

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?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top