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ódigoprueba ::
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
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
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. –
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