Python.expat 无法解析含有错误符号的 XML 文件。如何解决?

1 投票
1 回答
1252 浏览
提问于 2025-04-15 20:43

我正在用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数据?

撰写回答