Lxml конвертировать элемент в 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) Добавлены изменения, предложенные Аббасом. получили следующие ошибки:

    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

ОБНОВЛЕНИЕ:

Удалось запустить тест. Я не совсем уверен, почему. Если кто-то из измельчителей хочет дать объяснение, это поможет будущим людям, которые спотыкаются на это.

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. похожее на то, что отливка предоставляет на других языках, возможно...

спасибо

Ответ 1

Чтобы получить корневое дерево из _Element (сгенерировано с помощью lxml.html.fromstring), вы можете использовать метод getroottree:

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

Ответ 2

Метод etree.fromstring анализирует XML-строку и возвращает корневой элемент. Класс etree.ElementTree представляет собой обертку дерева вокруг элемента и как таковой требует элемент для создания экземпляра.

Следовательно, передача корневого элемента в конструктор etree.ElementTree() должна дать вам то, что вы хотите:

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

Ответ 3

An _Element, который возвращается вызовом типа:

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

Можно сделать _ElementTree следующим образом:

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

Надеюсь, что вы ожидаете.