尝试使用ElementTree解析包含未定义实体(即
)的XML时引发:
ParseError: undefined entity
在Python 2.x中,可以通过创建解析器(documentation)来更新dict实体:
parser = ET.XMLParser()
parser.entity["nbsp"] = unichr(160)
但是如何在Python 3.x中实现同样的功能呢?
更新:我这边有误解,因为我忽略了在尝试更新XML实体dict之前调用parser.parser.UseForeignDTD(1)
,这会导致解析器出错。幸运的是,@m.brindley很有耐心,他指出XML实体dict仍然存在于Python 3.x中,并且可以像在Python 2.x中一样进行更新
我有一个类似的问题,通过使用lxml来解决它。它的
etree.XMLParser
有一个recover
关键字参数,该参数迫使它尝试忽略损坏的XML。这里的问题是,XML中唯一有效的助记符实体是
quot
、amp
、apos
、lt
和gt
。这意味着几乎所有(X)HTML命名实体都必须使用XML 1.1 spec中定义的entity declaration markup在DTD中定义。如果文档是独立的,则应使用内联DTD完成,如下所示:xml.etree.ElementTree
中的XMLParser
使用xml.parsers.expat
进行实际的解析。在XMLParser
的init参数中,有一个用于predefined HTML entities的空格,但该参数尚未实现。在init方法中创建一个名为entity
的空dict,这是用来查找未定义实体的内容。我不认为expat(扩展来说,ET XMLParser)能够处理将名称空间切换到XHMTL之类的东西来解决这个问题。可能是因为它无法获取外部名称空间定义(我尝试将
xmlns="http://www.w3.org/1999/xhtml"
作为数据元素的默认名称空间,但效果不佳),但我无法确认。默认情况下,expat将对非XML实体引发一个错误,但是您可以通过定义外部DOCTYPE来解决这个问题-这将导致expat解析器将未定义的实体项传递回ET.XMLParser
的_default()
方法。_default()
方法查找XMLParser
实例中的entity
dict,如果找到匹配的键,它将用关联的值替换实体。这维护了问题中提到的Python-2.x语法。解决方案:
chr()
-unichr()
不再是有效的名称html.entities.html5
更新XMLParser.entity
,将所有有效的HTML5助记实体映射到它们的字符。HTMLParser
来处理助记实体,但这不会返回所需的ElementTree
。这是我使用的代码片段-它通过
HTMLParser
(演示如何通过子类添加实体处理)、ET.XMLParser
(使用实体映射)和expat
(由于外部DOCTYPE的原因,它将静默忽略未定义的实体)来解析带有外部DOCTYPE的XML。有一个有效的XML实体(>
)和一个未定义的实体(©
),我用ET.XMLParser
映射到chr(0x24B4)
。相关问题 更多 >
编程相关推荐