将html5lib与xml.etree.ElementT

2024-05-15 10:00:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要的是一种使用html5lib解析器生成一个xml.etree.ElementTree. (出于可移植性的考虑,lxml不是一个选项。)

ELementTree.parsecan take a parser作为可选参数

xml.etree.ElementTree.parse(source, parser=None)

但还不清楚这样的解析器是什么样子。HTML5中有没有可以用于parser参数的类或对象?关于这个问题的两个库的文档都很薄。在


上下文

我有一个格式错误的XHTML文件,无法用ElementTree.parse进行解析:

^{pr2}$

所以我使用了html5lib.parse,而使用了默认的treebuilder="etree"参数,效果很好。在

但是html5lib显然不输出xml.etree.ElementTree对象,只输出一个具有几乎相同API的对象。这有两个问题:

  • html5lib的find不支持^{} parameter,这使得XPath过于冗长而没有笨拙的wrapper function。在
  • Eclipse调试器不支持html5lib etrees的钻取。在

所以我不能单独使用ElementTree或html5lib。在


Tags: 对象parser解析器source参数parse选项xml
2条回答

您必须用ElementTree包装响应

>>> from xml.etree.ElementTree import ElementTree
>>> from html5lib import parse
>>>
>>> ElementTree(parse("<html>"))
<xml.etree.ElementTree.ElementTree at 0x...>

给定xml.etree.ElementTreeetree(通常导入为):

返回的不是etree.ElementTree,而是etree.Element(这与etree.fromstring返回的内容相同;只有etree.parse返回etree.ElementTree)。它确实是etree模块的一部分-它不是具有类似API的东西。您遇到的问题对etree.fromstring的影响与html5lib相同。在

Python documentation for ^{}没有提到namespaces参数-它似乎是ElementTree对象(但不是Element对象)的一个未记录的特性。因此,它可能不是真正应该依赖的东西!最好的办法是使用包装器函数。在

Eclipse不能遍历树的事实归结为html5lib在存在时默认为xml.etree.cElementTree,根据模块的文档,这是相同的,但是使用CPython的API在C中实现,从而阻止Eclipse的调试器工作。您可以使用非加速版本获得一个treebuilder(请注意,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>")

相关问题 更多 >