2012-01-12 32 views
10

La siguiente prueba lee un archivo y al usar lxml.html se generan los nodos hoja del DOM/Graph para la página.lxml convert element a elementtree

Sin embargo, también estoy tratando de averiguar cómo obtener la entrada de una "cadena". Usando

lxml.html.fromstring(s) 

no funciona, ya que esto genera un "elemento", en oposición a un "elementtree".

Por lo tanto, estoy tratando de averiguar cómo convertir un elemento en un ElementTree.

Pensamientos

código

prueba ::

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 

============================== =

actualización :::

(análisis de hTML en lugar de XML) añaden los cambios sugeridos por Abbas. conseguido los siguientes: 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 

ACTUALIZACIÓN :::

logró que el trabajo de prueba. No estoy exactamente seguro de por qué. Si alguien con py chops quiere dar una explicación, eso ayudaría a las personas futuras que tropiecen con esto.

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) 

parece que el módulo de StringIO/clase implementa la funcionalidad de IO que satisface lo que el paquete de análisis tiene que seguir adelante y procesar la cadena de entrada para la prueba de html. similar a lo que ofrece la fundición en otros idiomas tal vez ...

gracias

+0

El analizador XML se opone a la ' ' en el código HTML. Su HTML debe estar bien formado y no debe contener caracteres que el analizador no pueda digerir o que deban escapar correctamente. – Abbas

+0

hey Abbas.No estoy de acuerdo con lo que dices. El html en el archivo de prueba ahora funciona, cuando implemente la solución que proporcioné arriba, usando el StringIO en el análisis. –

+0

Eso es porque ahora está usando un analizador HTML (lxml.html) y StringIO. etree. etree intenta analizar HTML pero falla debido a caracteres codificados para HTML ( ). No sé por qué no estarías de acuerdo conmigo cuando propuse una solución basada en tu requisito de obtener un ElementTree de etree pasándole una cadena. Más tarde cambió su solución, mi solución sigue siendo válida para su requisito original. – Abbas

Respuesta

2

El método de análisis sintáctico de etree.fromstring una cadena XML y devuelve un elemento raíz. La clase etree.ElementTree es una envoltura de árbol alrededor de un elemento y, como tal, requiere un elemento para creación de instancias.

Por lo tanto, pasar el elemento raíz de la etree.ElementTree() constructor debe darle lo que quiere:

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

hey Abbas. gracias por la respuesta ... lo probé, obtuve el error mencionado anteriormente. (Estoy analizando html, en lugar de xml) –

+0

Agregue también su HTML a la pregunta. – Abbas

1

Un _Element, de manera que es devuelto por una llamada como:

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

Se puede hacer un _ElementTree como tal:

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

Hope eso es lo que esperas

7

Para obtener el árbol de la raíz de un _Element (generado con lxml.html.fromstring), se puede utilizar el método de getroottree:

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