使用xml.etree.ElementTree解析XHTML

1 投票
2 回答
2317 浏览
提问于 2025-04-17 17:42

我想在Python 3中使用 xml.etree.ElementTree 来解析一个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 的实例来实现类似的功能呢?

2 个回答

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
2

我也遇到了同样的问题。问题中的示例代码和选中的答案以前可能有效,但现在在我的Python 3.3和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)

撰写回答