python - 从外籍人士的解析错误中优雅地恢复

标签 python xml parsing unicode expat-parser

XML 应该是严格的,因此有一些 Unicode 字符在 XML 中是不允许的。但是,我正在尝试使用通常包含这些字符的 RSS 提要,并且我想避免因无效字符造成的解析错误,或者从中优雅地恢复并呈现文档。

请在此处查看示例(无论如何在 3 月 21 日):http://feeds.feedburner.com/chrisblattman

处理 XML 提要中的 unicode 的推荐方法是什么?检测字符并替换为空字节、编辑解析器或其他一些方法?

最佳答案

看起来 RSS 提要包含一个垂直制表符 \x0c,这是非法的 per the XML 1.0 spec .

我的建议是在将数据传递给 expat 之前过滤掉非法字符,而不是试图捕获错误并恢复。下面是一个过滤掉非法 Unicode 字符的例程。我在你的 chrisblattman.xml RSS feed 上测试了它:

import re
from xml.parsers import expat

# illegal XML 1.0 character ranges
# See http://www.w3.org/TR/REC-xml/#charsets
XML_ILLEGALS = u'|'.join(u'[%s-%s]' % (s, e) for s, e in [
    (u'\u0000', u'\u0008'),             # null and C0 controls
    (u'\u000B', u'\u000C'),             # vertical tab and form feed
    (u'\u000E', u'\u001F'),             # shift out / shift in
    (u'\u007F', u'\u009F'),             # C1 controls
    (u'\uD800', u'\uDFFF'),             # High and Low surrogate areas
    (u'\uFDD0', u'\uFDDF'),             # not permitted for interchange
    (u'\uFFFE', u'\uFFFF'),             # byte order marks
    ])

RE_SANITIZE_XML = re.compile(XML_ILLEGALS, re.M | re.U)

# decode, filter illegals out, then encode back to utf-8
data = open('chrisblattman.xml', 'rb').read().decode('utf-8')
data = RE_SANITIZE_XML.sub('', data).encode('utf-8')

pr = expat.ParserCreate('utf-8')
pr.Parse(data)

更新:这里是a Wikipedia page关于 XML 字符有效性。我上面的正则表达式过滤掉了 C1 控制范围,但您可能希望根据您的应用程序允许这些字符。

关于python - 从外籍人士的解析错误中优雅地恢复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5381577/

相关文章:

python - 使用漏勺验证可选值

python - 如何在程序中多次调用同一个进程

python - 如何按 pandas.value_counts 对结果进行排序

xml - ColdFusion 循环 xml 转义 xml 标签

Java XML 解析器 block (非常不寻常和奇怪!)

python - ImportError : No module named flask. ext.login

python - 自动 XSD 验证

php - 调用存储函数 'XMLFOREST'时参数不正确

c# - 解析 Datetime c# 的奇怪结果

python - 解析生成器 Python 2