2012-01-12 140 views
10

以下測試讀取文件,並使用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功能。類似於鑄件也許其他語言提供...

感謝

+0

XML解析器是在HTML反對的「 」。您的HTML格式必須正確,並且不得包含分析程序無法解析的字符,否則應該正確轉義。 – Abbas 2012-01-12 04:09:06

+0

嘿阿巴斯。我不同意你在說什麼。測試文件中的html現在可以工作,當我執行上面提供的解決方案時,使用解析中的StringIO。 – 2012-01-12 13:33:21

+0

這是因爲您現在正在使用HTML解析器(lxml.html)和StringIO。 etree。 etree嘗試解析HTML,但由於爲HTML編碼的字符( )失敗。我不知道爲什麼當我根據您通過傳遞字符串從etree獲取ElementTree的要求提出解決方案時,您會不同意我的觀點。您後來改變了您的解決方案,我的解決方案仍然適用於您的原始要求。 – Abbas 2012-01-12 13:41:01

回答

2

etree.fromstring方法解析XML字符串,並返回一個根元素。 etree.ElementTree類是元素周圍的樹封裝,因此需要實例化元素。

因此,根元素傳遞給etree.ElementTree()構造應該給你你想要的東西:

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

嘿阿巴斯。感謝您的回覆......嘗試過,得到了上面列出的錯誤。 (我解析html,而不是xml) – 2012-01-12 03:59:28

+0

請將您的HTML添加到問題中。 – Abbas 2012-01-12 04:04:14

1

_Element,使得通過像調用返回:

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

可製成一個_ElementTree像這樣:

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

Hope這就是你的期望。

7

要獲得從_Element(與lxml.html.fromstring生成)的根樹,你可以使用getroottree方法:

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