我想以一种可区分的方式打印出etree的树形结构(由html文档组成)(意味着两个etree应该以不同的方式打印出来)。
我所说的结构是指树的“形状”,这基本上是指所有的标签,但没有属性和文本内容。
有什么想法吗?在lxml中有什么东西可以做到这一点吗?
如果不是,我想我必须遍历整个树并构造一个字符串。你知道如何以一种紧凑的方式表示树吗?(“紧凑”特性不太重要)
仅供参考,它不是用来查看的,而是用来存储和散列的,以便能够在几个html模板之间产生差异。
谢谢
发布于 2012-10-30 15:35:33
也许只需在源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>https://stackoverflow.com/questions/13093091
复制相似问题