2012-01-12 5 views
10

다음 테스트는 파일을 읽고 lxml.html을 사용하여 페이지에 대한 DOM/그래프의 리프 노드를 생성합니다.lxml 요소를 elementtree로 변환

그러나 "문자열"에서 입력을 얻는 방법을 알아 내려고합니다. 사용하면 "ElementTree"가 아닌 "Element"가 생성되므로

lxml.html.fromstring(s) 

이 작동하지 않습니다.

그래서 요소를 ElementTree로 변환하는 방법을 알아 내려고하고 있습니다.

생각

테스트 코드 :

import lxml.html 
from lxml import etree # trying this to see if needed 
          # to convert from element to elementtree 


    #cmd='cat osu_test.txt' 
    cmd='cat o2.txt' 
    proc=subprocess.Popen(cmd, shell=True,stdout=subprocess.PIPE) 
    s=proc.communicate()[0].strip() 

    # s contains HTML not XML text 
    #doc = lxml.html.parse(s) 
    doc = lxml.html.parse('osu_test.txt') 
    doc1 = lxml.html.fromstring(s) 

    for node in doc.iter(): 
    if len(node) == 0: 
    print "aaa ",node.tag, doc.getpath(node) 
    #print "aaa ",node.tag 

    nt = etree.ElementTree(doc1)  <<<<< doesn't work.. so what will?? 
    for node in nt.iter(): 
    if len(node) == 0: 
    print "aaa ",node.tag, doc.getpath(node) 
    #print "aaa ",node.tag 

============================== =

갱신 :::

압바스에 의해 제안 추가 변경 (XML 대신 HTML을 구문 분석). 다음 잘못한다있어 :

doc1 = etree.fromstring(s) 
    File "lxml.etree.pyx", line 2532, in lxml.etree.fromstring (src/lxml/lxml.etree.c:48621) 
    File "parser.pxi", line 1545, in lxml.etree._parseMemoryDocument (src/lxml/lxml.etree.c:72232) 
    File "parser.pxi", line 1424, in lxml.etree._parseDoc (src/lxml/lxml.etree.c:71093) 
    File "parser.pxi", line 938, in lxml.etree._BaseParser._parseDoc (src/lxml/lxml.etree.c:67862) 
    File "parser.pxi", line 539, in lxml.etree._ParserContext._handleParseResultDoc (src/lxml/lxml.etree.c:64244) 
    File "parser.pxi", line 625, in lxml.etree._handleParseResult (src/lxml/lxml.etree.c:65165) 
    File "parser.pxi", line 565, in lxml.etree._raiseParseError (src/lxml/lxml.etree.c:64508) 
lxml.etree.XMLSyntaxError: Entity 'nbsp' not defined, line 48, column 220 

UPDATE ::: 테스트 작업을 얻기 위해 관리

. 왜 그랬는지 정확히 모르겠습니다. 피 볶음밥을 가진 사람이 설명을하기를 원한다면,이 말은 미래의 사람들에게 도움이 될 것입니다.

from cStringIO import StringIO 
from lxml.html import parse 

doc1 = parse(StringIO(s)) 

for node in doc1.iter(): 
    if len(node) == 0: 
     print "aaa ", node.tag, doc1.getpath(node) 

IT는있는 StringIO 모듈/클래스는 구문 분석 패키지는 가서 테스트 HTML에 대한 입력 문자열을 처리하는 데 필요한 것을 만족 IO 기능을 구현 것으로 보인다. ... 캐스팅은 아마도 다른 언어로 제공하는 것과 유사한

감사

+0

XML 파서가 HTML에서 ' '에 반대한다 : – Abbas

+0

안녕하세요, 압바스.네가하는 말에 동의하지 않는다. 테스트 파일의 html은 이제 위에서 제공된 솔루션을 구현할 때 구문 분석에서 StringIO를 사용하여 작동합니다. –

+0

이제는 HTML 파서 (lxml.html)와 StringIO를 사용하고 있기 때문입니다. etree. etree는 HTML을 구문 분석하려고하지만 HTML ( ) 용으로 인코딩 된 문자 때문에 실패합니다. 엘리먼트 트리를 문자열로 전달하여 엘리 트리를에 트리로부터 가져 오는 요구 사항에 기반한 솔루션을 제안했을 때 왜 당신이 나와 동의하지 않는지 모르겠습니다. 나중에 솔루션을 변경했지만 내 솔루션은 원래 요구 사항에 대해 여전히 유효합니다. – Abbas

답변

2

etree.fromstring 방법은 XML 문자열을 구문 분석하고 루트 요소를 반환합니다. etree.ElementTree 클래스는 요소 주위의 트리 래퍼이므로 인스턴스화를 위해 요소가 필요합니다.

따라서 etree.ElementTree() 생성자에 루트 요소를 전달하는 것은 당신이 원하는 무엇을 제공해야합니다 :

tree = etree.HTML(result.read(), etree.HTMLParser()) 

을 만들 수 있습니다 : 그와 같은 호출에 의해 반환되는 등

root = etree.fromstring(s) 
nt = etree.ElementTree(root) 
+0

안녕하세요, 압바스. 회신 해 주셔서 감사합니다 ... 그것을 시도, 위에 나열된 오류있어. (xml 대신 HTML을 파싱합니다.) –

+0

질문에 HTML을 추가하십시오. – Abbas

1

_Element을, _ElementTree 이렇게 :

희망 그것이 당신이 기대하는 것입니다.

doc = lxml.html.parse(s) 
tree = doc.getroottree() 
7

이 ( lxml.html.fromstring 생성)을 _Element에서 루트 트리를 얻으려면, 당신은 getroottree 방법을 사용할 수 있습니다. HTML은 잘 형성되어야하며 파서가 소화 할 수없는 문자를 포함하거나 올바르게 이스케이프 처리해야합니다.