我想使用xml.etree.ElementTree
在Python 3中解析XHTML文档。该文档包含
个实体,因此我无法使用默认的解析器设置。我想做类似的事情:
with urllib.request.urlopen(BASE_URL) as url:
body = url.read()
parser = ET.XMLParser()
parser.parser.UseForeignDTD(True)
parser.entity.update(entitydefs)
etree = ET.ElementTree()
root = etree.fromstring(body)
但fromstring
是ElementTree
中的免费功能。如何实现与ElementTree
实例类似的东西?
答案 0 :(得分:2)
提供解析器:
with urllib.request.urlopen(BASE_URL) as url:
body = url.read()
parser = ET.XMLParser()
parser.parser.UseForeignDTD(True)
parser.entity.update(entitydefs)
parser.feed(body)
root = parser.close() # this returns you the tree
答案 1 :(得分:1)
我遇到了同样的问题。问题和所选答案中的示例代码可能之前有效,但是现在它在我的Python 3.3和Python 3.4环境中不起作用。
我终于开始工作了。引自此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 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)