Kev*_*rke 4 python xml unicode parsing expat-parser
XML 应该是严格的,因此 XML 中不允许使用一些 Unicode 字符。然而,我正在尝试使用通常包含这些字符的 RSS 提要,并且我希望避免无效字符的解析错误,或者从它们中优雅地恢复并无论如何呈现文档。
请参阅此处的示例(无论如何在 3 月 21 日):http://feeds.feedburner.com/chrisblattman
在 XML feed 中处理 unicode 的推荐方法是什么?检测字符并替换为空字节,编辑解析器,还是其他方法?
看起来该 RSS 提要包含垂直制表符,根据 XML 1.0 规范,\x0c该字符是非法的。
我的建议是在将数据传递给 expat 之前过滤掉非法字符,而不是尝试捕获错误并恢复。下面是一个过滤掉非法 Unicode 字符的例程。我在你的chrisblattman.xmlRSS 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)
Run Code Online (Sandbox Code Playgroud)
更新:这是有关 XML 字符有效性的Wikipedia 页面。我上面的正则表达式过滤掉了 C1 控制范围,但您可能希望根据您的应用程序允许这些字符。
| 归档时间: |
|
| 查看次数: |
941 次 |
| 最近记录: |