Analizar HTML a través de XPath

En .Net, encontré esta gran biblioteca, HtmlAgilityPack , que te permite analizar fácilmente HTML no bien formado usando XPath. He usado esto durante un par de años en mis sitios .Net, pero he tenido que conformarme con bibliotecas más dolorosas para Python, Ruby y otros proyectos. ¿Alguien sabe de bibliotecas similares para otros idiomas?

En Python, ElementTidy analiza la sopa de tags y produce un árbol de elementos, que permite realizar consultas utilizando XPath:

>>> from elementtidy.TidyHTMLTreeBuilder import TidyHTMLTreeBuilder as TB >>> tb = TB() >>> tb.feed("

Hello world") >>> e= tb.close() >>> e.find(".//{http://www.w3.org/1999/xhtml}p")

Me sorprende que no haya una sola mención de lxml. Es increíblemente rápido y funcionará en cualquier entorno que permita las bibliotecas CPython.

Aquí le mostramos cómo puede analizar HTML a través de XPATH usando lxml .

 >>> from lxml import etree >>> doc = '' >>> tree = etree.HTML(doc) >>> r = tree.xpath('/foo/bar') >>> len(r) 1 >>> r[0].tag 'bar' >>> r = tree.xpath('bar') >>> r[0].tag 'bar' 

BeautifulSoup es una buena biblioteca de Python para tratar con el HTML desordenado de manera limpia.

Los resultados más estables que he tenido han sido utilizando el soupparser de lxml.html. Deberá instalar python-lxml y python-beautifulsoup, luego puede hacer lo siguiente:

 from lxml.html.soupparser import fromstring tree = fromstring('here!') matches = tree.xpath("./mal[@form=ed]") 

Parece que la pregunta podría plantearse de manera más precisa como ” Cómo convertir HTML a XML para que las expresiones XPath puedan evaluarse en su contra “.

Aquí hay dos buenas herramientas:

  1. TagSoup , un progtwig de código abierto, es una herramienta basada en Java y SAX, desarrollada por John Cowan . Este es un analizador compatible con SAX escrito en Java que, en lugar de analizar XML bien formado o válido, analiza HTML como se encuentra en la naturaleza: pobre, desagradable y brutal, aunque a menudo no es nada corto. TagSoup está diseñado para las personas que tienen que procesar estas cosas utilizando cierta apariencia de un diseño de aplicación racional. Al proporcionar una interfaz SAX, permite que las herramientas estándar de XML se apliquen incluso al peor HTML. TagSoup también incluye un procesador de línea de comandos que lee archivos HTML y puede generar HTML limpio o XML bien formado que es una aproximación cercana a XHTML.
    Taggle es un puerto comercial de TagSoup en C ++.

  2. SgmlReader es una herramienta desarrollada por Chris Lovett de Microsoft.
    SgmlReader es una API de XmlReader sobre cualquier documento SGML (incluido el soporte integrado para HTML). También se proporciona una utilidad de línea de comandos que genera el resultado XML bien formado.
    Descargue el archivo zip que incluye el ejecutable independiente y el código fuente completo: SgmlReader.zip

Para Ruby, recomiendo Hpricot que Jb Evain señaló. Si está buscando un competidor basado en libxml más rápido, Nokogiri (ver http://tenderlovemaking.com/2008/10/30/nokogiri-is-released/ ) también es bastante bueno (admite búsquedas de XPath y CSS como Hpricot pero es más rápido). Hay un wiki básico y algunos puntos de referencia .

Un logro sobresaliente es el puro XSLT 2.0 Parser de HTML escrito por David Carlisle .

Leer su código sería un gran ejercicio de aprendizaje para cada uno de nosotros.

De la descripción:

d: htmlparse (cadena)
d: htmlparse (cadena, espacio de nombres, modo html)

La forma de un argumento es equivalente a
d: htmlparse (cadena, ‘ http://ww.w3.org/1999/xhtml ‘, true ()))

Analiza la cadena como HTML y / o XML utilizando algunas heurísticas integradas para)
Control implícito de apertura y cierre de elementos.

No tiene pleno conocimiento de HTML DTD pero tiene una lista completa de
Elementos vacíos y lista completa de definiciones de entidades. Entidades HTML, y
Se aceptan referencias de caracteres decimales y hexadecimales. Nota html-entidades
se reconocen incluso si html-mode = false ().

Los nombres de los elementos están en minúsculas (si html-mode es verdadero ()) y se colocan en la
espacio de nombres especificado por el parámetro de espacio de nombres (que puede ser “” para denotar
no-namespace a menos que la entrada tenga declaraciones explícitas de espacio de nombres, en
en cuyo caso serán honrados.

Los nombres de los atributos están en minúsculas si html-mode = true ()

Lea una descripción más detallada aquí .

Espero que esto haya ayudado.

Aclamaciones,

Dimitre Novatchev.

Hay una implementación gratuita de C para XML llamada libxml2 que tiene algunos api bits para XPath que he usado con gran éxito, y que puede especificar HTML como el documento que se está cargando. Esto me había funcionado para algunos documentos HTML que no eran perfectos …

En su mayor parte, XPath es más útil cuando el HTML de entrada está correctamente codificado y se puede leer ‘como un documento xml’. Es posible que desee considerar el uso de una utilidad que sea específica para este propósito para limpiar documentos HTML. Aquí hay un ejemplo: http://tidy.sourceforge.net/

En lo que respecta a estas herramientas XPath, es probable que la mayoría de las implementaciones se basen en bibliotecas C o C ++ preexistentes, como libxml2.