Python.expat não pode analisar arquivo XML com símbolos incorretos.Como dar a volta?
-
21-09-2019 - |
Pergunta
Estou tentando analisar um arquivo XML (dados OSM) com o expatriado e há linhas com alguns caracteres Unicode que o expatriado não consegue analisar:
<tag k="name"
v="абвгдежзиклмнопр�?туфхцчшщьыъ�?ю�?�?БВГДЕЖЗИКЛМ�?ОПРСТУФХЦЧШЩЬЫЪЭЮЯ" />
<tag k="name" v="Cin\x8e? Rex" />
(A codificação do arquivo XML na linha de abertura é "UTF-8")
O arquivo é bastante antigo e deve ter havido erros.Em arquivos modernos, não vejo erros UTF-8 e eles são analisados corretamente.Mas e se meu programa encontrar um símbolo quebrado, que solução alternativa posso fazer?É possível juntar o codec bz2 (eu analiso um arquivo compactado) e o codec utf-8 para ignorar os caracteres quebrados ou alterá-los para "?"?
Solução
Não tenho certeza se os caracteres '�' foram introduzidos aqui, mas se você os possui nos dados originais, parece ser um problema de gerador que introduziu ufffd charactes como:
"Usado para substituir um caráter de entrada cujo valor é desconhecido ou não representável em unicode"
citado de:http://www.fileformat.info/info/unicode/char/fffd/index.htm
Gambiarra?Apenas uma ideia para extensão:
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 limpe o buffer de entrada + casos extremos (sequência parcial no final do buffer).Não me lembro se o expatriado do python permite atribuir um manipulador de erros personalizado.Isso seria mais fácil então.
Se eu limpar sua amostra dos caracteres '�', ela será processada ok.\xd1 não falha.
Dados OSM?