gpt4 book ai didi

python - 在 Python 中解析巨大的、编码错误的 XML 文件

转载 作者:太空狗 更新时间:2023-10-29 18:04:03 25 4
gpt4 key购买 nike

我一直在研究解析外部 XML 文件的代码。其中一些文件很大,数据量高达千兆字节。不用说,这些文件需要被解析为流,因为将它们加载到内存中效率太低,并且经常导致 OutOfMemory 问题。

我使用过 miniDOM、ElementTree、cElementTree 库,目前正在使用 lxml。现在我有一个有效的、非常节省内存的脚本,使用 lxml.etree.iterparse .问题是我需要解析的一些 XML 文件包含编码错误(它们标榜为 UTF-8,但包含不同编码的字符)。使用 lxml.etree.parse 时这可以通过使用 recover=True 来修复自定义解析器的选项,但是 iterparse不接受自定义解析器。 (另请参阅:this question)

我当前的代码如下所示:

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 时出错遇到错误字符(在本例中为 ^Y ):

lxml.etree.XMLSyntaxError: Input is not proper UTF-8, indicate encoding !
Bytes: 0x19 0x73 0x20 0x65, line 949490, column 25

我什至不想解码这些数据,我可以放弃它。但是我不知道有什么方法可以跳过该元素 - 我试过 context.nextcontinue在 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,错误发生在字节0x19 0x73 0x20 0x65 .
根据 hexedit,19 73 20 65转换为 ASCII .s e
.在这个地方应该是一个撇号(照片)。

我还找到了this question ,它不提供解决方案。

最佳答案

如果问题是实际的字符编码问题,而不是格式错误的 XML,最简单且可能最有效的解决方案是在文件读取点处理它。像这样:

import codecs
from lxml import etree
events = ("start", "end")
reader = codecs.EncodedFile(xmlfile, 'utf8', 'utf8', 'replace')
context = etree.iterparse(reader, events=events)

这将导致非 UTF8 可读字节被替换为“?”。还有其他一些选择;有关更多信息,请参阅编解码器模块的文档。

关于python - 在 Python 中解析巨大的、编码错误的 XML 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11400308/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com