2012-10-26 5 views
10

etreeのツリー構造(htmlドキュメントから形成されたもの)を微妙な方法で印刷したいとします(2つのetreeを別々に印刷する必要があります)。lxml(またはlxml.html):プリントツリー構造

私が構造体を意味するのは、基本的にすべてのタグを意味しますが、属性もテキストコンテンツもありません。

それを行うために何かlxmlにはありますか?

もしそうでなければ、私はツリー全体を反復してそれから文字列を構成しなければならないと思います。どのようにコンパクトな方法でツリーを表現するか考えていますか? (「コンパクト」機能のほうが関連性が低い)

FYIこれは見ているわけではなく、いくつかのhtmlテンプレート間で違いを生むように保存され、ハッシュされることを意図しています。

おかげ

+2

'.tostring()'メソッドがあなたのためにしていないものがありますか? – kindall

+0

これは明らかではない場合は申し訳ありません:私はツリーの構造によって、基本的にはタグ、テキスト、属性はありません(質問に追加) – lajarre

+1

LXMLにこの機能が組み込まれているとは思いませんあなたは木を歩かなければなりません。 –

答えて

9

は多分ちょうど

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) 

を与える...それはあなたがハッシュ可能性があり、文字列を取得するためにetree.tostringを使用するのに十分そして簡単です、タグ以外のすべてを除去するために、ソースのXMLの上にいくつかのXSLTを実行しますあなたの出力:

<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

関連する問題