Python.expat 无法解析含有错误符号的 XML 文件。如何解决?
我正在用expat解析一个XML文件(OSM数据),但是里面有些行包含一些Unicode字符,expat无法解析:
<tag k="name"
v="абвгдежзиклмнопр�?туфхцчшщьыъ�?ю�?�?БВГДЕЖЗИКЛМ�?ОПРСТУФХЦЧШЩЬЫЪЭЮЯ" />
<tag k="name" v="Cin\x8e? Rex" />
(XML文件的开头声明编码为“UTF-8”)
这个文件比较旧,可能之前有错误。在现代的文件中,我没有看到UTF-8的错误,它们都能正常解析。但是如果我的程序遇到一个损坏的符号,我该怎么处理呢?有没有办法把bz2编码(因为我在解析一个压缩文件)和utf-8编码结合起来,忽略那些损坏的字符,或者把它们改成“?”呢?
1 个回答
1
不太确定这里的'�'字符是不是因为复制粘贴字符串时引入的,但如果你在原始数据中也有这些字符,那可能是生成器的问题,它引入了\uFFFD这个字符。
这个字符的意思是:
“用来替代一个值未知或在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的expat是否允许设置自定义错误处理器。如果可以,那就简单多了。
如果我把你的样本中的'�'字符清理掉,处理起来就没问题了。
\xd1不会出错。
OSM数据?