【问题标题】:How to skip a node which raises an error when using cElementTree.iterparse()如何在使用 cElementTree.iterparse() 时跳过引发错误的节点
【发布时间】:2012-10-14 13:22:21
【问题描述】:

我正在尝试解析一个非常大的 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...

【问题讨论】:

  • 我强烈推荐BeautifulSoup的API。
  • iterparse 遇到错误后,它会按定义停止。您可以检查事件堆栈,它将始终在错误处终止。

标签: python xml iterparse


【解决方案1】:

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

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

【讨论】:

  • lxml 是否有某种可以处理大文件的 iterateparse?
  • @user1262403:我的代码示例向您展示了iterparse() 接口; lxml 提供扩展的 ElementTree API。
【解决方案2】:

您可以使用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

^

【讨论】:

  • 谢谢,但即使我看到错误在哪里,我仍然无法修复文件中的任何内容。甚至打开它也需要几分钟,更不用说在其中导航了。我也认为有很多这样的错误。我认为这与我打开文件时的编码有关。否则我想找到一种方法跳过这部分并迭代到下一个
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多