簡體   English   中英

lxml將元素轉換為elementtree

[英]lxml convert element to elementtree

以下測試讀取文件,並使用lxml.html為頁面生成DOM / Graph的葉節點。

但是,我也試圖弄清楚如何從“字符串”獲取輸入。 運用

 lxml.html.fromstring(s)

不起作用,因為這會生成“元素”而不是“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)添加了Abbas建議的更改。 得到以下錯誤:

    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 chop的人想要提供解釋,這將有助於未來的人偶然發現這一點。

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模塊/類實現了IO功能,它滿足了解析包需要繼續處理測試html的輸入字符串。 類似於鑄造提供的其他語言也許......

謝謝

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

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

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

因此,將根元素傳遞給etree.ElementTree()構造函數應該可以為您提供所需的內容:

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

一個_Element ,通過如下調用返回:

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

可以像這樣制作一個_ElementTree

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

希望這是你所期望的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM