gpt4 book ai didi

python - 将 html5lib 与 xml.etree.ElementTree 一起使用

转载 作者:太空宇宙 更新时间:2023-11-04 03:52:10 26 4
gpt4 key购买 nike

我需要的是一种使用 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 的对象。这有两个问题:

所以我不能单独使用 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/

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