span extractfirst extract_first div attribute python html ruby xpath parsing
SgmlReader.zip

python - extractfirst - scrapy xpath div id



Analizar HTML a través de XPath (8)

En .Net, encontré esta gran biblioteca, HtmlAgilityPack , que le permite analizar fácilmente el HTML no formado utilizando XPath. Lo he usado 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 conoce bibliotecas similares para otros idiomas?


En Python, ElementTidy analiza la sopa de etiquetas y produce un árbol de elementos, que permite consultar usando XPath:

>>> from elementtidy.TidyHTMLTreeBuilder import TidyHTMLTreeBuilder as TB >>> tb = TB() >>> tb.feed("<p>Hello world") >>> e= tb.close() >>> e.find(".//{http://www.w3.org/1999/xhtml}p") <Element {http://www.w3.org/1999/xhtml}p at 264eb8>


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

En su mayor parte, XPath es más útil cuando el HTML entrante está codificado correctamente 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 descubras que la mayoría de las implementaciones se basan en bibliotecas C o C ++ preexistentes, como libxml2.


Los resultados más estables que he tenido han sido usar el analizador de sopa de lxml.html. Necesitarás instalar python-lxml y python-beautifulsoup, luego puedes hacer lo siguiente:

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


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 de CPython.

A continuación, le mostramos cómo puede analizar HTML mediante XPATH utilizando lxml .

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



Parece que la pregunta podría formularse de forma 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 programa de fuente abierta, 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 un XML bien formado o válido, analiza HTML tal como se lo encuentra en estado salvaje: pobre, desagradable y brutal, aunque a menudo lejos de ser corto. TagSoup está diseñado para personas que tienen que procesar este material utilizando una apariencia de diseño de aplicación racional. Al proporcionar una interfaz SAX, permite que las herramientas XML estándar 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 C ++ de TagSoup.

  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 incluyendo el ejecutable independiente y el código fuente completo: SgmlReader.zip


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

Leer su código sería un gran ejercicio de aprendizaje para todos 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 (string, '' http://ww.w3.org/1999/xhtml '', true ()))

Analiza la cadena como HTML y / o XML utilizando algunas heurísticas incorporadas a)
controlar la apertura y el cierre implícitos de los elementos.

No tiene pleno conocimiento de HTML DTD, pero sí tiene una lista completa de
elementos vacíos y lista completa de definiciones de entidades. Entidades HTML, y
las referencias de caracteres hexadecimales y decimales son todas aceptadas. Tenga en cuenta html-entities
se reconocen incluso si html-mode = false ().

Los nombres de los elementos están en minúscula (si html-mode es verdadero ()) y se colocan en el
espacio de nombres especificado por el parámetro de espacio de nombres (que puede ser "" para indicar
sin espacio de nombres a menos que la entrada tenga declaraciones explícitas del espacio de nombres, en
qué caso se honrarán.

Los nombres de 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.


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