我需要一种使用 html5lib 解析器生成真正的 xml.etree.ElementTree 的方法。 (出于可移植性原因,lxml 不是一个选项。)
ELementTree.parse
can take a parser作为可选参数
xml.etree.ElementTree.parse(source, parser=None)
但尚不清楚这样的解析器会是什么样子。 HTML5 中是否有一个类或对象可以用作 parser
参数?两个库关于这个问题的文档都很薄弱。
上下文:
我有一个格式错误的 XHTML 文件,无法使用 ElementTree.parse
进行解析:
<?xml version="1.0" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Title</title></head>
<body><div class="cls">Note that this br<br>is missing a closing slash</div></body>
</html>
所以我使用 html5lib.parse
代替默认的 treebuilder="etree"
参数,效果很好。
但是 html5lib 显然不会输出 xml.etree.ElementTree
对象,而只是输出一个具有几乎相同 API 的对象。这有两个问题:
- html5lib 的
find
不支持namespaces
parameter ,使得 XPath 过于冗长而不笨拙 wrapper function . - Eclipse 调试器不支持 html5lib etree 的钻取。
所以我不能单独使用 ElementTree 或 html5lib。
最佳答案
将 xml.etree.ElementTree
指定为 etree
(通常导入为):
返回的不是 etree.ElementTree
,而是 etree.Element
(这与 etree.fromstring
返回的内容相同) ;只有 etree.parse
返回 etree.ElementTree
)。它确实是 etree 模块的一部分——它不具有类似的 API。您遇到的问题同样适用于 etree.fromstring
和 html5lib。
Python documentation for xml.etree.ElementTree
没有提到 namespaces
参数 - 它似乎是 ElementTree
对象(但不是 Element
对象)的未记录功能。因此,它可能不是真正应该依赖的东西!您最好的选择可能是使用包装函数。
Eclipse 无法遍历树的事实是由于 html5lib 在存在时默认为 xml.etree.cElementTree
— 根据模块的文档,这意味着是相同的,但是使用 CPython 的 API 在 C 中实现,阻止 Eclipse 的调试器运行。您可以使用非加速版本(请注意,Python 3.3 中的两者都是 C 实现 - cElementTree
仅作为已弃用的别名保留下来)使用以下命令来获取树构建器:
import xml.etree.ElementTree as etree
import html5lib
tb = html5lib.getTreeBuilder("etree", implementation=etree)
p = html5lib.HTMLParser(tb)
tree = p.parse("<html>")
关于python - 将 html5lib 与 xml.etree.ElementTree 结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20786980/