我正在阅读数百个XML文件并使用xml.etree.ElementTree解析它们。
快速背景只是fwiw: 这些XML文件在某一时刻完全有效,但不知何故,在历史上处理它们时,我复制/粘贴它们的进程可能已经损坏了它们。 (事实证明这是一个令人沮丧的问题/声明没有结束,如果你关心,看到我在... Python shutil copyfile - missing last few lines调查得到的好帮助。
无论如何回到这个问题。
我仍然希望阅读这些有效XML文档的前100,000行左右。这些文件只丢失了6MB文件的最后4或5KB。然而,正如前面提到的那样,该文件只是“切断”。它看起来像这样:
</Maintag>
<Maintag>
<Change_type>NQ</Change_type>
<Name>Atlas</Name>
<Test>ATLS</Test>
<Other>NYSE</Other>
<Scheduled_E
其中(可能很明显)Scheduled_E是应该是另一个属性的开头,&lt; .Scheduled_Event&gt ;,比如说。但是文件在标签中间缩短了。再一次,在文件中的这一点之前,有几千个“好”的“Maintag”条目,我想读入,接受截止条目(显然任何应该发生的事情)作为不可恢复的失败。
一个简单但不完整的处理方法可能就是简单地 - 预处理XML - 查找字符串的最后一个实例&lt; ./ Maintag&gt;在文件中,用'opening'标签替换后面的内容(在某些时候会被破坏)。同样,这至少让我处理仍然存在且有效的内容。
如果有人想帮我解决这种字符串替换问题,那么fwiw开头标记是:
<?xml version="1.0" encoding="ISO-8859-1" ?>
<FirstTag>
<Source FileName="myfile">
我希望比这更容易,可能会有一个elementtree或beautifulsoup或其他处理这种情况的方式......我做了大量的搜索,似乎没有什么容易/显而易见。
由于
答案 0 :(得分:3)
为了处理未关闭的元素 - 或者像在这个问题的标题中那样的标记,我建议尝试lxml
。 lxml
的{{1}} XMLParser
选项documented为:{/}
recover - 尝试解析破碎的XML
例如,给定一个破碎的XML如下:
recover
上面代码打印的恢复的XML如下:
from lxml import etree
xml = """
<root>
<Maintag>
<Change_type>NQ</Change_type>
<Name>Atlas</Name>
<Test>ATLS</Test>
<Other>NYSE</Other>
<Scheduled_E
"""
parser = etree.XMLParser(recover=True)
doc = etree.fromstring(xml, parser=parser)
print(etree.tostring(doc))