gpt4 book ai didi

Python ElementTree 支持解析未知 XML 实体?

转载 作者:IT老高 更新时间:2023-10-28 20:54:35 28 4
gpt4 key购买 nike

我有一组 super 简单的 XML 文件要解析...但是...它们使用自定义定义的实体。我不需要将这些映射到字符,但我确实希望对每个字符进行解析和操作。例如:

<Style name="admin-5678">
<Rule>
<Filter>[admin_level]='5'</Filter>
&maxscale_zoom11;
</Rule>
</Style>

http://effbot.org/elementtree/elementtree-xmlparser.htm 上有一个诱人的提示。 XMLParser 对实体的支持有限,但我找不到提到的方法,一切都会出错:

    #!/usr/bin/python
##
## Where's the entity support as documented at:
## http://effbot.org/elementtree/elementtree-xmlparser.htm
## In Python 2.7.1+ ?
##
from pprint import pprint
from xml.etree import ElementTree
from cStringIO import StringIO

parser = ElementTree.ElementTree()
#parser.entity["maxscale_zoom11"] = unichr(160)
testf = StringIO('<foo>&maxscale_zoom11;</foo>')
tree = parser.parse(testf)
#tree = parser.parse(testf,"XMLParser")
for node in tree.iter('foo'):
print node.text

这取决于你如何调整评论给出:

xml.etree.ElementTree.ParseError: undefined entity: line 1, column 5

AttributeError: 'ElementTree' object has no attribute 'entity'

AttributeError: 'str' object has no attribute 'feed'           

对于那些好奇的人,XML 来自 OpenStreetMap的 mapnik 项目。

最佳答案

正如@cnelson 已经在评论中指出的那样,此处选择的解决方案不适用于 Python 3。

我终于让它工作了。引自 Q&A .

灵感来自 this post ,我们可以在传入的原始 HTML 内容之前添加一些 XML 定义,然后 ElementTree 就可以开箱即用了。

这适用于 Python 2.6、2.7、3.3、3.4。

import xml.etree.ElementTree as ET

html = '''<html>
<div>Some reasonably well-formed HTML content.</div>
<form action="login">
<input name="foo" value="bar"/>
<input name="username"/><input name="password"/>

<div>It is not unusual to see &nbsp; in an HTML page.</div>

</form></html>'''

magic = '''<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" [
<!ENTITY nbsp ' '>
]>''' # You can define more entities here, if needed

et = ET.fromstring(magic + html)

关于Python ElementTree 支持解析未知 XML 实体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7237466/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com