我一直在研究解析外部 XML 文件的代码。其中一些文件很大,高达千兆字节的数据。不用说,这些文件需要被解析为流,因为将它们加载到内存中效率太低,并且经常导致 OutOfMemory 麻烦。
我使用了 miniDOM、ElementTree、cElementTree 库,目前正在使用 lxml。现在我有一个工作的、非常节省内存的脚本,使用lxml.etree.iterparse
. 问题是我需要解析的一些 XML 文件包含编码错误(它们宣传为 UTF-8,但包含不同编码的字符)。使用lxml.etree.parse
时可以通过使用recover=True
自定义解析器的选项来修复它,但iterparse
不接受自定义解析器。(另见:这个问题)
我当前的代码如下所示:
from lxml import etree
events = ("start", "end")
context = etree.iterparse(xmlfile, events=events)
event, root_element = context.next() # <items>
for action, element in context:
if action == 'end' and element.tag == 'item':
# <parse>
root_element.clear()
iterparse
遇到错误字符时出错(在这种情况下,它是 a ^Y
):
lxml.etree.XMLSyntaxError: Input is not proper UTF-8, indicate encoding !
Bytes: 0x19 0x73 0x20 0x65, line 949490, column 25
我什至不想解码这些数据,我可以放弃它。但是我不知道有什么方法可以跳过该元素 - 我尝试过context.next
并continue
在 try/except 语句中。
任何帮助,将不胜感激!
更新
一些附加信息:这是 iterparse 失败的行:
<description><![CDATA:[musea de la photographie fonds mercator. Met meer dan 80.000 foto^Ys en 3 miljoen negatieven is het Muse de la...]]></description>
根据 etree,错误发生在 bytes 0x19 0x73 0x20 0x65
。
根据 hexedit,19 73 20 65
转换为 ASCII.s e
在.
这个地方应该是一个撇号(foto's)。
我还发现了这个问题,它没有提供解决方案。