Python.expat не может проанализировать XML-файл с плохими символами. Как обойти? - PullRequest
0 голосов
/ 22 марта 2010

Я пытаюсь проанализировать XML-файл (данные OSM) с помощью expat, и есть строки с некоторыми символами Unicode, которые expat не может проанализировать:

<tag k="name"
v="абвгдежзиклмнопр�?туфхцчшщьыъ�?ю�?�?БВГДЕЖЗИКЛМ�?ОПРСТУФХЦЧШЩЬЫЪЭЮЯ" />

<tag k="name" v="Cin\x8e? Rex" />

(кодировка XML-файла в открывающей строке "UTF-8")

Файл довольно старый, и, должно быть, были ошибки. В современных файлах я не вижу ошибок UTF-8, и они анализируются нормально. Но что, если моя программа встречает неработающий символ, какой обходной путь я могу сделать? Можно ли присоединить кодек bz2 (я анализирую сжатый файл) и кодек utf-8, чтобы игнорировать неработающие символы, или изменить их на «?»?

1 Ответ

1 голос
/ 23 марта 2010

Не уверен, были ли введены символы 'introduced' при вставке строки здесь, но если они есть в исходных данных, то, похоже, это генератор Проблема, которая представила \ uFFFD, характеризуется как:

"используется для замены входящего символа, значение которого неизвестно или непредставим в Юникоде "

Цитируется из: http://www.fileformat.info/info/unicode/char/fffd/index.htm

Обход? Просто идея для расширения:

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

Или очистить входной буфер вместо + угловых случаев (частичная последовательность в конце буфера). Я не могу вспомнить, если экспат Python позволяет назначить пользовательский обработчик ошибок. Тогда было бы проще.

Если я уберу твой образец из символов 'it's', он будет обработан нормально. \ xd1 не дает сбоя.

данные OSM?

...