2012-10-26 26 views
10

我想以可區分的方式打印出etree(由html文檔形成)的樹結構(意味着兩個etrees應打印出不同的結果)。lxml(或lxml.html):打印樹結構

我的意思是結構是樹的「形狀」,它基本上意味着所有的標籤,但沒有屬性和文本內容。

有什麼想法?在lxml中有什麼要做的嗎?

如果不是,我想我必須迭代整個樹並從中構建一個字符串。任何想法如何以緊湊的方式表示樹? (「緊湊」功能不那麼相關)

僅供參考它並不是要查看,而是要存儲和哈希以便能夠在幾個html模板之間做出區別。

感謝

+2

有''.tostring()'方法不是爲你做的嗎? – kindall

+0

是的,如果不清楚,對不起:我的意思是樹的結構基本上只是標籤,沒有文本,沒有任何屬性(添加問題) – lajarre

+1

我不認爲LXML具有內置的這種功能,所以你必須走樹。 –

回答

9

也許只是運行在源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> 
+0

準確地說,我對XSLT並不瞭解,它似乎是做我想做的事情的正確和標準方式 – lajarre

+0

一旦你養成了它的習慣,那麼它對於任何開始時都有很多結構並想要把它變成更可管理的東西。請記住,默認規則與此樣式表相同 - http://pastebin.com/b3WHMjPx - 所以它複製元素和屬性,但沒有別的。 – spiralx

+1

這個地方有一個非常好的教程,甚至更好的參考材料XML的所有東西:http://zvon.org/comp/m/tutorial.html – spiralx