当前位置: 首页 > 知识库问答 >
问题:

如何使lxml的迭代解析忽略无效的XML字符?

汪思博
2023-03-14

我有一个包含无效字符的XML。LXML的XMLParser会对这些无效字符抛出异常,但当我使用recover=True选项创建XMLParser时,它会忽略错误字符并正常工作。

我的问题是如何为lxml的iterparse函数设置类似的标志?

繁殖:

断开的XML(/tmp/z.XML):

<?xml version="1.0" encoding="utf-8"?>
<items>
    <item>
        <B>Bad characters:</B>
    </item>
</items>

注意:字符串“Bad characters:”后面有两个ASCII字符#31(0x1F),我无法在这里复制粘贴。

XMLParser的解析错误:

fd = open('/tmp/z.xml')
parser = etree.XMLParser()
tree   = etree.parse(fd, parser)

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "lxml.etree.pyx", line 2576, in lxml.etree.parse (src/lxml/lxml.etree.c:22796)
  File "parser.pxi", line 1488, in lxml.etree._parseDocument (src/lxml/lxml.etree.c:60390)
  File "parser.pxi", line 1518, in lxml.etree._parseFilelikeDocument (src/lxml/lxml.etree.c:60687)
  File "parser.pxi", line 1401, in lxml.etree._parseDocFromFilelike (src/lxml/lxml.etree.c:59658)
  File "parser.pxi", line 991, in lxml.etree._BaseParser._parseDocFromFilelike (src/lxml/lxml.etree.c:57303)
  File "parser.pxi", line 538, in lxml.etree._ParserContext._handleParseResultDoc (src/lxml/lxml.etree.c:53512)
  File "parser.pxi", line 624, in lxml.etree._handleParseResult (src/lxml/lxml.etree.c:54372)
  File "parser.pxi", line 564, in lxml.etree._raiseParseError (src/lxml/lxml.etree.c:53770)
lxml.etree.XMLSyntaxError: PCDATA invalid Char value 31, line 4, column 21

要忽略错误字符,我将recover=True设置为OK:

import lxml.etree as etree
fd = open('/tmp/z.xml')
parser = etree.XMLParser(recover=True)
tree   = etree.parse(fd, parser)
etree.tostring(tree)

# OUTPUT:
<items>\n\t<item>\n\t\t<B>Bad characters:</B>\n\t</item>\n</items>'

使用iterparse时,我再次遇到相同的错误,但如何使其忽略坏字符?

fd = open('/tmp/z.xml')
it = etree.iterparse(fd, events=("start", "end"))
for e in it: print e
...
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "iterparse.pxi", line 498, in lxml.etree.iterparse.__next__ (src/lxml/lxml.etree.c:73245)
  File "parser.pxi", line 564, in lxml.etree._raiseParseError (src/lxml/lxml.etree.c:53770)
lxml.etree.XMLSyntaxError: PCDATA invalid Char value 31, line 4, column 21

共有1个答案

桂德义
2023-03-14

iterparse还接受recover参数:

it = etree.iterparse(fd, events=("start", "end"), recover=True)

(文档:lxml iterparse)

 类似资料:
  • 问题内容: 当我发送此请求时: 我的休息服务: 我期望得到一个例外,因为: 我的域模型中没有invalidField。 日期格式无效。 但是实际上我得到的测试对象具有空值。我的dmain模型是: 我认为这不是有效的行为。我该如何解决? 感谢帮助。 解: 正如Blaise Doughan所说,需要扩展MOXy的MOXyJsonProvider并重写preReadFrom方法以设置自定义javax.x

  • 问题内容: 我正在使用Business Intelligence 2008在SSRS中创建一个表。我有一个日期(作为字符串)作为表中使用的值之一。此值可以包含表示日期的字符串,也可以为空白。如果它有一个值,我想用另一种方式格式化该值。现在,我对显示它的单元格具有以下表达式: 如果该字段具有值,则可以完美地工作。但是,当该字段为空白时,该单元格将填充。如果我只有该功能,这将是有意义的,但似乎应该防止

  • 我想知道是否可以使用此方法忽略字段,因为我有一个要忽略的字段列表,在同一个类中,那么我该如何做呢? 我正在使用 谢谢

  • 目前,我正在研究一个涉及解析从另一个产品接收到的XML的特性。我决定针对一些实际的客户数据运行一些测试,看起来另一个产品允许应该被认为是无效的用户输入。不管怎么说,我还是得想出一个解析它的方法。我们正在使用,我在输入上得到一个错误,如下所示。 正如您所看到的,描述中有一个似乎无效的标记()。现在,这个描述标记是一个叶子标记,不应该有任何嵌套的标记。无论如何,这仍然是一个问题,并在上产生异常 我知道

  • 问题内容: 在python中,如何指示它忽略提供给method的未定义选项? 例如 我只为我的实例定义了选项,但是我用list调用 编辑: 我不在乎是否将其从原始列表中筛选出来。我只想忽略未定义的选项。 我这样做的原因是因为我正在使用SCons的AddOption接口添加自定义生成选项。但是,其中一些选项指导目标的声明。因此,我需要在脚本的不同位置将它们从sys.argv中解析出来,而无需访问所有