2012-01-12 38 views
10

Bài kiểm tra sau đây đọc một tệp và sử dụng lxml.html tạo các nút lá của DOM/Biểu đồ cho trang.lxml chuyển đổi phần tử thành elementtree

Tuy nhiên, tôi cũng đang cố gắng tìm ra cách lấy đầu vào từ một "chuỗi". Sử dụng

lxml.html.fromstring(s) 

không hoạt động, vì điều này tạo ra phần tử "" thay vì "ElementTree".

Vì vậy, tôi đang cố gắng tìm ra cách chuyển đổi phần tử thành ElementTree.

Suy nghĩ

đang

thử nghiệm ::

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 

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

cập nhật :::

(phân tích cú pháp html thay vì xml) gia tăng những thay đổi được đề xuất bởi Abbas. có các errs sau:

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 

CẬP NHẬT :::

Managed để có được những hoạt động thử nghiệm. Tôi không chắc chắn lý do tại sao. Nếu một người nào đó với bộ phận bẫy của py muốn cung cấp một lời giải thích, điều đó sẽ giúp những người trong tương lai vấp ngã điều này.

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) 

có vẻ như mô-đun/lớp StringIO thực hiện chức năng IO thỏa mãn gói phân tích cần xử lý và xử lý chuỗi đầu vào cho html thử nghiệm. tương tự như những gì đúc cung cấp bằng các ngôn ngữ khác có lẽ ...

nhờ

+0

Các xml parser đang phản đối việc ' ' trong HTML của bạn. HTML của bạn phải được định dạng tốt và không được chứa các ký tự mà trình phân tích cú pháp không thể tiêu hóa hoặc chúng phải được thoát đúng cách. – Abbas

+0

hey Abbas.Tôi không đồng ý với những gì bạn đang nói. Html trong tệp thử nghiệm hiện hoạt động, khi tôi triển khai giải pháp mà tôi đã cung cấp ở trên, sử dụng StringIO trong phân tích cú pháp. –

+0

Đó là vì bạn hiện đang sử dụng trình phân tích cú pháp HTML (lxml.html) và StringIO. etree. etree cố gắng phân tích cú pháp HTML nhưng không thành công do các ký tự được mã hóa cho HTML ( ). Tôi không biết tại sao bạn sẽ không đồng ý với tôi khi tôi đề xuất một giải pháp dựa trên yêu cầu của bạn nhận được một ElementTree từ etree bằng cách đi qua nó một chuỗi. Sau đó bạn đã thay đổi giải pháp của mình, giải pháp của tôi vẫn hợp lệ cho yêu cầu ban đầu của bạn. – Abbas

Trả lời

2

Phương pháp etree.fromstring phân tích một chuỗi XML và trả về một phần tử gốc. Lớp etree.ElementTree là một trình bao bọc cây xung quanh một phần tử và do đó yêu cầu một phần tử để khởi tạo.

Vì vậy, đi qua các phần tử gốc để các nhà xây dựng etree.ElementTree() nên cung cấp cho bạn những gì bạn muốn:

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

hey Abbas. cảm ơn cho trả lời ... đã thử nó, có lỗi được liệt kê ở trên. (Tôi đang phân tích html, thay vì xml) –

+0

Vui lòng thêm HTML của bạn vào câu hỏi. – Abbas

1

Một _Element, chẳng hạn được trả về bởi một cuộc gọi như:

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

có thể được thực hiện an _ElementTree giống như vậy:

tree = tree.getroottree() # convert _Element to _ElementTree 

Hy vọng đó là những gì bạn mong đợi.

7

Để có được cây gốc từ một _Element (được tạo ra với lxml.html.fromstring), bạn có thể sử dụng phương pháp getroottree:

doc = lxml.html.parse(s) 
tree = doc.getroottree() 
Các vấn đề liên quan