【发布时间】:2011-12-14 03:31:12
【问题描述】:
我编写了一个需要访问底层 HTML 页面的 DOM 表示的小型应用程序。 Lxml真的很棒但是我一直没能找到这样的接口。有人知道是否存在或者是否有其他工具可以做到这一点?
【问题讨论】:
标签: python dom html-parsing lxml
我编写了一个需要访问底层 HTML 页面的 DOM 表示的小型应用程序。 Lxml真的很棒但是我一直没能找到这样的接口。有人知道是否存在或者是否有其他工具可以做到这一点?
【问题讨论】:
标签: python dom html-parsing lxml
According to the lxml documentation,可以使用 lxml 来解析文档,它的 SAX 解析器可以与 Python xml.dom.pulldom 模块接口来创建 DOM 对象。从文档中,代码可能如下所示:
from xml.dom.pulldom import SAX2DOM
handler = SAX2DOM()
lxml.sax.saxify(tree, handler)
dom = handler.document
【讨论】:
在lxml site 有一个example of parsing 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)
【讨论】:
我在几个需要 DOM 表示的项目中使用了minidom(尤其是示例 19.7.2)。
事实证明,它对于解析 xml 配置文件和清理编写不佳的 HTML 很有用。我想向您灌输对 minidom 的信心,因为它在实践中是一个非常有用的工具!
【讨论】:
【讨论】: