【发布时间】:2012-02-11 21:40:11
【问题描述】:
我正在尝试使用 Python 的 lxml 库解析超过 2GB 的 XML 文件。不幸的是,XML 文件没有一行告诉字符编码,所以我必须手动设置它。但是,在遍历文件时,仍然偶尔会出现一些奇怪的字符。
我不确定如何确定该行的字符编码,但此外,lxml 将从 for 循环的范围内引发 XMLSyntaxError。如何正确捕获此错误并正确处理?这是一个简单的代码sn-p:
from lxml import etree
etparse = etree.iterparse(file("my_file.xml", 'r'), events=("start",), encoding="CP1252")
for event, elem in etparse:
if elem.tag == "product":
print "Found the product!"
elem.clear()
这最终会产生错误:
XMLSyntaxError: PCDATA invalid Char value 31, line 1565367, column 50
文件的那一行如下所示:
% sed -n "1565367 p" my_file.xml
<romance_copy>Ravioli Florentine. Tender Ravioli Filled With Creamy Ricotta Cheese And
填充的“F”在我的终端中实际上是这样的:
【问题讨论】:
-
您是否已经简单地尝试过“utf-8”进行编码?
-
@jsbueno:问题出在“Filled”中“F”之前的字符,其值为 31(十进制)或 0x1F。根据 XML 规范,这是一个无效字符,因此告诉它使用 UTF-8 编码不会有任何影响。问题是如何让 lxml 更优雅地处理坏字符(即不抛出异常)。我在 lxml 文档中没有找到执行此操作的选项。