以下測試讀取文件,並使用lxml.html生成頁面的DOM /圖形的葉節點。lxml將元素轉換爲元素樹
但是,我也想弄清楚如何從「字符串」獲取輸入。使用
lxml.html.fromstring(s)
不起作用,因爲這會產生一個「Element」而不是「ElementTree」。
所以,我想弄清楚如何將元素轉換爲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
============================== =
更新:::
(解析HTML而不是XML) 新增阿巴斯建議的修改。得到了以下ERRS:
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 :::
設法拿到了測試工作。我不完全確定爲什麼。如果有人用py pyops想要提供解釋,那將有助於未來的人們在這方面遇到困難。
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)
看來StringIO模塊是/類實現滿足哪些解析包需要繼續處理的HTML測試輸入字符串IO功能。類似於鑄件也許其他語言提供...
感謝
XML解析器是在HTML反對的「 」。您的HTML格式必須正確,並且不得包含分析程序無法解析的字符,否則應該正確轉義。 – Abbas 2012-01-12 04:09:06
嘿阿巴斯。我不同意你在說什麼。測試文件中的html現在可以工作,當我執行上面提供的解決方案時,使用解析中的StringIO。 – 2012-01-12 13:33:21
這是因爲您現在正在使用HTML解析器(lxml.html)和StringIO。 etree。 etree嘗試解析HTML,但由於爲HTML編碼的字符( )失敗。我不知道爲什麼當我根據您通過傳遞字符串從etree獲取ElementTree的要求提出解決方案時,您會不同意我的觀點。您後來改變了您的解決方案,我的解決方案仍然適用於您的原始要求。 – Abbas 2012-01-12 13:41:01