【问题标题】:DOMDocument interface for python lxmlpython lxml的DOMDocument接口
【发布时间】:2011-12-14 03:31:12
【问题描述】:

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

【问题讨论】:

    标签: python dom html-parsing lxml


    【解决方案1】:

    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
    

    【讨论】:

      【解决方案2】:

      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)
      

      但请记住lxml API is superior to dom/minidom

      【讨论】:

        【解决方案3】:

        我在几个需要 DOM 表示的项目中使用了minidom(尤其是示例 19.7.2)。

        事实证明,它对于解析 xml 配置文件和清理编写不佳的 HTML 很有用。我想向您灌输对 minidom 的信心,因为它在实践中是一个非常有用的工具!

        【讨论】:

          【解决方案4】:

          【讨论】:

          • Yes 正在考虑这个,但出于以下原因正在寻找更好的解决方案。首先,听起来 lxml 更好更快,最后是因为它似乎不是一个很好的实现(我想我已经阅读了一些关于试图避免 minidom 的这些行,但我自己对后者没有强烈的意见)
          猜你喜欢
          • 1970-01-01
          • 2016-07-09
          • 2013-02-07
          • 1970-01-01
          • 2014-06-01
          • 1970-01-01
          • 2021-04-23
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多