lxml(或lxml.html):打印树结构

Posted

技术标签:

【中文标题】lxml(或lxml.html):打印树结构【英文标题】:lxml (or lxml.html): print tree structure 【发布时间】:2012-10-17 01:59:32 【问题描述】:

我想以可区分的方式打印出 etree(由 html 文档形成)的树结构(意味着两个 etree 应该以不同的方式打印出来)。

我所说的结构是树的“形状”,基本上是指所有的标签,但没有属性,也没有文本内容。

有什么想法吗? lxml 中有什么东西可以做到这一点吗?

如果不是,我想我必须遍历整个树并从中构造一个字符串。知道如何以紧凑的方式表示树吗? (“紧凑”功能不太相关)

仅供参考,它不是用来查看的,而是用来存储和散列的,以便能够在几个 html 模板之间产生差异。

谢谢

【问题讨论】:

.tostring() 方法有什么不适合你的吗? 是的,很抱歉,如果不清楚:我所说的树结构基本上只是标签,没有文本,也没有属性(有问题添加) 我不认为 LXML 内置了这个功能,所以你必须走树。 【参考方案1】:

也许只是在源 XML 上运行一些 XSLT 以去除除标签之外的所有内容,然后使用etree.tostring 来获得一个可以散列的字符串就很容易了...

from lxml import etree as ET

def pp(e):
    print ET.tostring(e, pretty_print=True)
    print

root = ET.XML("""\
<project id="8dce5d94-4273-47ef-8d1b-0c7882f91caa" kpf_version="4">
<livefolder id="8744bc67-1b9e-443d-ba9f-96e1d0007ba8" idref="707cd68a-33b5-4051-9e40-8ba686c2fdb8">Mooo</livefolder>
<livefolder id="8744bc67-1b9e-443d-ba9f" idref="707cd68a-33b5-4051-9e40-8ba686c2fdb8" />
<preference-set idref="8dce5d94-4273-47ef-8d1b-0c7882f91caa">
  <boolean id="import_live">0</boolean>
</preference-set>
</project>
""")
pp(root)


xslt = ET.XML("""\
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="*">
    <xsl:copy>
      <xsl:apply-templates select="*"/>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>
""")
tr = ET.XSLT(xslt)

doc2 = tr(root)
root2 = doc2.getroot()
pp(root2)

给你输出:

<project id="8dce5d94-4273-47ef-8d1b-0c7882f91caa" kpf_version="4">
  <livefolder id="8744bc67-1b9e-443d-ba9f-96e1d0007ba8" idref="707cd68a-33b5-4051-9e40-8ba686c2fdb8">Mooo</livefolder>
  <livefolder id="8744bc67-1b9e-443d-ba9f" idref="707cd68a-33b5-4051-9e40-8ba686c2fdb8"/>
  <preference-set idref="8dce5d94-4273-47ef-8d1b-0c7882f91caa">
    <boolean id="import_live">0</boolean>
  </preference-set>
</project>

<project>
  <livefolder/>
  <livefolder/>
  <preference-set>
    <boolean/>
  </preference-set>
</project>

【讨论】:

确切地说,我对 XSLT 了解不多,它似乎是做我想做的事情的正确和标准方式 一旦你养成了它的习惯,那么它对于你从大量结构开始并希望将其变成更易于管理的东西的任何事情都非常有用。请记住默认规则与此样式表相同 - pastebin.com/b3WHMjPx - 所以它复制元素和属性,但没有其他内容。 这个地方有一个很好的教程,甚至更好的 XML 参考资料:zvon.org/comp/m/tutorial.html

以上是关于lxml(或lxml.html):打印树结构的主要内容,如果未能解决你的问题,请参考以下文章

BeautifulSoup 和 lxml.html - 更喜欢啥? [复制]

Python:使用`lxml.html`将HTML内容注入标签

python lxml 使用

“BeautifulSoup”和“lxml”有啥关系?

python怎么安装lxml html 解析器

BeautifulSoup:“lxml”、“html.parser”和“html5lib”解析器有啥区别?