2012-10-26 12 views
10

Chciałbym wydrukować strukturę drzewiastą elementu etree (utworzonego z dokumentu HTML) w różny sposób (co oznacza, że ​​dwie strony powinny być drukowane inaczej).lxml (lub lxml.html): struktura drzewa drukowania

Co mam na myśli przez strukturę to "kształt" drzewa, który w zasadzie oznacza wszystkie znaczniki, ale bez atrybutów i treści tekstowych.

Każdy pomysł? Czy jest coś w tym, aby to zrobić?

Jeśli nie, to myślę, że muszę iterować przez całe drzewo i skonstruować ciąg znaków z tego. Masz pomysł, jak przedstawić drzewo w zwarty sposób? (funkcja "kompaktowa" jest mniej istotna)

FYI nie jest przeznaczona do oglądania, ale do przechowywania i mieszania, aby móc dokonać różnic między kilkoma szablonami html.

Dzięki

+2

Czy jest coś, co metoda ".tostring()" nie robi dla Ciebie? – kindall

+0

Tak, przepraszam, jeśli to nie było jasne: to, co rozumiem przez strukturę drzewa, to w zasadzie tylko tagi, brak tekstu, brak atrybutu ani nie (dodany w pytaniu). – lajarre

+1

Nie sądzę, że LXML ma wbudowaną tę funkcję, więc będziesz musiał chodzić po drzewie. –

Odpowiedz

9

Może wystarczy uruchomić jakąś XSLT nad XML źródłowego rozebrać wszystko, ale znaczniki, to wtedy na tyle łatwy w użyciu etree.tostring uzyskać ciąg można Hash ...

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) 

Daje ty wyjście:

<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

Dokładnie nie wiedziałem o XSLT i wydaje mi się, że jest to właściwy i standardowy sposób robienia tego, co chcę – lajarre

+0

Gdy już weźmiesz w tym udział, to jest to naprawdę przydatne dla wszystkiego, od czego zaczynasz z dużą strukturą i chcesz przekształcić go w coś łatwiejszego w zarządzaniu. Pamiętaj tylko, że domyślne reguły są takie same jak ten arkusz stylów - http://pastebin.com/b3WHMjPx - więc kopiuje elementy i atrybuty, ale nic więcej. – spiralx

+1

To miejsce ma bardzo dobry samouczek, a nawet lepszy materiał referencyjny do wszystkich rzeczy XML: http://zvon.org/comp/m/tutorial.html – spiralx

Powiązane problemy