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ĩ
đangthử 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ờ
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
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. –
Đó 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