使用cElementTree.iterparse()时如何跳过引发错误的节点

时间:2012-10-14 13:22:21

标签: python xml iterparse

我正在尝试解析一个非常大的XML文件并执行小写并删除标点符号。 问题是,当我尝试使用cET parse function解析大文件时,在某些时候它会遇到格式错误的标记或字符,引发syntax error

SyntaxError: not well-formed (invalid token): line 639337, column 4

注意:我几乎不可能阅读文件,所以我看不出问题所在。

如何跳过或解决此问题?

from xml.etree import cElementTree as cET

for event, elem in cET.iterparse(xmlFile, events=("start", "end")):
    ...do something...

2 个答案:

答案 0 :(得分:4)

使用lxml代替标准库ElementTree;它支持相同的API,但可以处理损坏的XML;如果可能的话,它会尝试修复它:

parser = etree.XMLParser(recover=True)
context = etree.iterparse(filename, parser)

答案 1 :(得分:0)

您可以使用xmllint之类的工具来验证和清理XML。此工具报告的错误应该可以帮助您修复XML文件。

编辑一个例子:

$ cat invalid.xml 
<?xml version="1.0"?>
<foo>
<bar>
</foo>
$ xmllint invalid.xml 
invalid.xml:4: parser error : Opening and ending tag mismatch: bar line 3 and foo
</foo>
      ^
invalid.xml:5: parser error : Premature end of data in tag foo line 2

^