Python.expat не может анализировать XML-файл с неверными символами.Как объехать?
-
21-09-2019 - |
Вопрос
Я пытаюсь проанализировать файл XML (данные OSM) с помощью expat, и есть строки с некоторыми символами Юникода, которые expat не может проанализировать:
<tag k="name"
v="абвгдежзиклмнопр�?туфхцчшщьыъ�?ю�?�?БВГДЕЖЗИКЛМ�?ОПРСТУФХЦЧШЩЬЫЪЭЮЯ" />
<tag k="name" v="Cin\x8e? Rex" />
(Кодировка XML-файла в первой строке — «UTF-8»)
Файл довольно старый, и, должно быть, были ошибки.В современных файлах я не вижу ошибок UTF-8, и они нормально анализируются.Но что, если моя программа встретит неработающий символ, какой обходной путь я могу сделать?Можно ли объединить кодек bz2 (я анализирую сжатый файл) и кодек utf-8, чтобы игнорировать неработающие символы, или изменить их на «?»?
Решение
Не уверен, что символы «�» были представлены здесь строкой для копирования, но если они у вас есть в исходных данных, то, похоже, проблема генератора, которая представила Ufffd Charactes как:
«Используется для замены входящего символа, значение которого неизвестно или не представлен в Unicode»
взято из: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 назначать собственный обработчик ошибок.Тогда это было бы проще.
Если я очистю ваш образец от символов '', он будет обработан нормально.\xd1 не дает сбоя.
Данные ОСМ?