2012-01-12 5 views
10

Следующий тест читает файл, а с помощью lxml.html генерирует листовые узлы DOM/Graph для страницы.lxml convert element to elementtree

Однако, я также пытаюсь выяснить, как получить входные данные из строки. Использование

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 

UPDATE :::

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

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

благодаря

+0

XML-парсер несогласие с « » в вашем HTML. Ваш HTML должен быть хорошо сформирован и либо не должен содержать символов, которые парсер не может переваривать, либо их следует экранировать правильно. – Abbas

+0

эй Аббас.Я не согласен с тем, что вы говорите. Html в тестовом файле теперь работает, когда я реализую решение, указанное выше, используя StringIO в синтаксическом анализе. –

+0

Это потому, что теперь вы используете парсер HTML (lxml.html) и StringIO. etree. etree пытается проанализировать HTML, но сбой из-за символов, закодированных для HTML ( ). Я не знаю, почему вы не согласились бы со мной, когда я предложил решение, основанное на вашем требовании получить ElementTree от etree, передав ему строку. Позднее вы изменили свое решение, мое решение по-прежнему действует для вашего первоначального требования. – Abbas

ответ

2

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

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

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

эй Аббас. спасибо за ответ ... попробовал, получил ошибку, указанную выше. (я разбираю html вместо xml) –

+0

Пожалуйста, добавьте свой HTML-код на вопрос. – Abbas

1

_Element, например, возвращаемый вызовом, как:

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

Может быть a _ElementTree:

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

Надежда это то, чего вы ожидаете.

7

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

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