Python lxml的DOMDocument接口

5 投票
4 回答
2315 浏览
提问于 2025-04-17 04:53

我写了一个小应用程序,需要访问底层HTML页面的DOM表示。Lxml非常不错,但我找不到这样的接口。有人知道是否存在这样的接口,或者有没有其他工具可以做到这一点吗?

4 个回答

1

我在几个项目中使用过 minidom(特别是示例19.7.2),当需要用到DOM表示时,它非常有用。

它在解析xml配置文件和整理写得不太好的HTML方面表现得很好。我想让你对minidom充满信心,因为在实际使用中,它真的是一个很有用的工具!

2

根据lxml的说明,使用lxml可以解析文档,并且它的SAX解析器可以和Python的xml.dom.pulldom模块配合使用,来创建一个DOM对象。根据说明,代码可能会像这样:

from xml.dom.pulldom import SAX2DOM
handler = SAX2DOM()
lxml.sax.saxify(tree, handler)
dom = handler.document
2

lxml 网站 上,有一个关于如何解析 HTML 的 示例

>>> from lxml import etree
>>> from StringIO import StringIO

>>> broken_html = "<html><head><title>test<body><h1>page title</h3>"

>>> parser = etree.HTMLParser()
>>> tree   = etree.parse(StringIO(broken_html), parser)

>>> result = etree.tostring(tree.getroot(),
...                         pretty_print=True, method="html")
>>> print(result)
<html>
  <head>
    <title>test</title>
  </head>
  <body>
    <h1>page title</h1>
  </body>
</html>

你可以通过一些方法来访问树形结构中的元素,比如 tree.find, tree.findall, tree.iter, tree.xpath 等等。举个例子:

>>> tree.getroot().getchildren()
[<Element head at 0x4f4ad38>, <Element body at 0x4f4ad80>]

>>> tree.getroot()..find('body')
<Element body at 0x4f4ad80>

你也可以使用标准的 Python XML 接口,正如 Kurt 所提到的:

>>> from xml.dom.pulldom import SAX2DOM
>>> handler = SAX2DOM()
>>> lxml.sax.saxify(tree, handler)

>>> dom = handler.document
>>> print(dom.firstChild.localName)

但要记住,lxml 的 API 比 dom/minidom 更强大

撰写回答