Python lxml的DOMDocument接口
我写了一个小应用程序,需要访问底层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)