1

我想用xml.etree.ElementTreePython 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)

fromstringElementTree. 我怎样才能用ElementTree实例实现类似的东西?

4

2 回答 2

2

好吧,我遇到了同样的问题。问题中的示例代码和选择的答案可能以前有效,但现在它不适用于我的 Python 3.3 和 Python 3.4 环境。

我终于让它工作了。引自此问答

这篇文章的启发,我们可以在传入的原始 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)
于 2016-02-24T01:18:58.663 回答
1

输入解析器:

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
于 2013-03-02T19:07:22.120 回答