2012-10-26 2 views
10

etree (html 문서에서 형성됨)의 트리 구조를 차별화 된 방법으로 인쇄하고 싶습니다 (두 etree가 다르게 인쇄해야 함을 의미).lxml (또는 lxml.html) : 인쇄 트리 구조

구조가 의미하는 것은 기본적으로 모든 태그를 의미하지만 속성은 없으며 텍스트 내용이없는 트리의 "모양"입니다.

아이디어가 있으십니까? 거기에 뭔가 할 lxml 있나요?

그렇지 않은 경우 전체 트리를 반복하고 문자열을 구성해야합니다. 어떤 방법으로 나무를 콤팩트하게 표현할 수 있을까요? ("컴팩트"기능은 덜 관련되어 있습니다.)

FYI 이것은 보려는 것이 아니라 여러 html 템플리트간에 차이를 만들 수 있도록 저장되고 해시되도록하기위한 것입니다.

감사

+2

'.tostring()'메소드가 당신을 위해하지 않는 것이 있습니까? – kindall

+0

그래, 미안, 분명하지 않다면 : 나무의 구조가 의미하는 것은 기본적으로 태그, 텍스트, 속성이 없다는 것이다. (덧붙여 질문에) – lajarre

+1

LXML에이 기능이 내장되어 있다고 생각하지 않는다. 당신은 나무를 걸어야 할 것입니다. –

답변

9

어쩌면 그냥 ... 당신이 해시 수있는 문자열을 얻을 수 etree.tostring을 사용하기에 충분 한 후 쉽게, 태그하지만 모든 것을 제거하기 위해 원본 XML을 통해 일부 XSLT를 실행

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