requests_html requests library from code python parsing lxml

python - requests - Equivalente a InnerHTML cuando se utiliza lxml.html para analizar HTML



requests python code (3)

Lo siento por volver a mencionar esto, pero he estado buscando una solución y la suya contiene un error:

<body>This text is ignored <h1>Title</h1><p>Some text</p></body>

Se ignora el texto directamente debajo del elemento raíz. Terminé haciendo esto:

(body.text or '''') +/ ''''.join([html.tostring(child) for child in body.iterchildren()])

Estoy trabajando en un script utilizando lxml.html para analizar páginas web. He hecho un poco de BeautifulSoup en mi tiempo pero ahora estoy experimentando con lxml debido a su velocidad.

Me gustaría saber cuál es la forma más sensata de la biblioteca para hacer el equivalente de InnerHtml de Javascript, es decir, recuperar o establecer el contenido completo de una etiqueta.

<body> <h1>A title</h1> <p>Some text</p> </body>

InnerHtml es por lo tanto:

<h1>A title</h1> <p>Some text</p>

Puedo hacerlo usando hacks (convertir a string / regexes, etc.) pero asumo que hay una forma correcta de hacerlo usando la biblioteca que me falta por falta de familiaridad. Gracias por cualquier ayuda.

EDITAR: Gracias a pobk por mostrarme el camino en esto de manera rápida y efectiva. Para cualquiera que intente lo mismo, esto es lo que terminé con:

from lxml import html from cStringIO import StringIO t = html.parse(StringIO( """<body> <h1>A title</h1> <p>Some text</p> Untagged text <p> Unclosed p tag </body>""")) root = t.getroot() body = root.body print (element.text or '''') + ''''.join([html.tostring(child) for child in body.iterdescendants()])

Tenga en cuenta que el analizador lxml.html corregirá la etiqueta no cerrada, así que tenga cuidado si esto es un problema.


Puede obtener los hijos de un nodo ElementTree usando los métodos getchildren () o iterdescendants () del nodo raíz:

>>> from lxml import etree >>> from cStringIO import StringIO >>> t = etree.parse(StringIO("""<body> ... <h1>A title</h1> ... <p>Some text</p> ... </body>""")) >>> root = t.getroot() >>> for child in root.iterdescendants(),: ... print etree.tostring(child) ... <h1>A title</h1> <p>Some text</p>

Esto se puede resumir de la siguiente manera:

print ''''.join([etree.tostring(child) for child in root.iterdescendants()])


import lxml.etree as ET body = t.xpath("//body"); for tag in body: h = html.fromstring( ET.tostring(tag[0]) ).xpath("//h1"); p = html.fromstring( ET.tostring(tag[1]) ).xpath("//p"); htext = h[0].text_content(); ptext = h[0].text_content();

también puede usar .get(''href'') para una etiqueta y .attrib para el atributo,

Aquí la etiqueta no está codificada, pero también puedes hacer esta dinámica