En .Net, encontré esta gran biblioteca, HtmlAgilityPack que le permite analizar fácilmente HTML no bien formado con 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?Parse HTML a través de XPath
Respuesta
en Python, ElementTidy análisis sintáctico de la sopa de la etiqueta y produce un árbol de elementos, que permite la consulta de XPath usando:
>>> 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>
BeautifulSoup es una buena biblioteca de Python para manejar el HTML desordenado de manera limpia.
BeautifulSoup no utiliza XPath :) – dzen
Parece que la pregunta podría formularse con mayor precisión como "Cómo convertir HTML a XML para que las expresiones XPath puedan evaluarse contra él".
Éstos son dos buenas herramientas:
TagSoup, un programa de código abierto, es un Java y SAX - herramienta basada, desarrollado 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 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 C++ de TagSoup.SgmlReader es una herramienta desarrollada por Microsoft Chris Lovett.
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.
Descargar el archivo zip que incluye el ejecutable independiente y el código fuente completo: SgmlReader.zip
un logro excepcional se the pure XSLT 2.0 Parser of HTML escrito por David Carlisle.
Leer su código sería un gran ejercicio de aprendizaje para todos nosotros.
partir de la descripción:
"d: htmlparse (cadena)
d: htmlparse (cadena, espacio de nombres, html-mode)
La única forma de argumento es equivalente a)
d: htmlparse (cadena, 'http://ww.w3.org/1999/xhtml', true()))
Divide la cadena como HTML y/o XML usando algunas heurísticas incorporadas a)
control implica apertura y cierre de elementos.
No tiene pleno conocimiento de HTML DTD pero sí que tiene la lista completa de
elementos vacíos y la lista completa de definiciones de entidades.Se aceptan entidades HTML y
referencias de caracteres hexadecimales y hexadecimales. Nota html-entities
se reconocen incluso si html-mode = false().
nombres Element serán minúsculas (si html-modo es cierto()) y se colocan en el espacio de nombres
especificado por el parámetro de espacio de nombres (que puede ser "" para denotar
no-espacio de nombres a menos que el entrada ha eXPLICT declaraciones de espacios de nombres, en
cuyo caso éstos serán honrados.
nombres de los atributos serán minúsculas si html-mode = true() "
Lea una descripción más detallada here.
Espero que esto haya ayudado.
Saludos,
Dimitre Novatchev.
Para Ruby, recomiendo Hpricot que Jb Evain señaló. Si está buscando un competidor más rápido basado en libxml, Nokogiri (vea http://tenderlovemaking.com/2008/10/30/nokogiri-is-released/) también es bastante bueno (es compatible con búsquedas XPath y CSS como Hpricot, pero es más rápido). Hay un wiki básico y otro benchmarks.
lo recomiendo mucho [Nokogiri] (http: // nokogiri. org) en estos días. Es todo lo que Hpricot era y más. –
Existe una implementación C gratuita para XML llamada libxml2 que tiene algunos bits api para XPath que he utilizado con gran éxito, que puede especificar HTML como el documento que se está cargando. Esto me había funcionado para algunos documentos HTML menos que perfectos ...
En general, XPath es más útil cuando el código 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/
Por lo que respecta a estas herramientas XPath, es probable que descubra que la mayoría de las implementaciones se basan en bibliotecas C o C++ preexistentes como libxml2.
Me sorprende que no hay una sola mención a lxml. Es increíblemente rápido y funcionará en cualquier entorno que permita las bibliotecas de CPython.
Así es como you can parse HTML via XPATH using 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'
Maldita sea, esta es una vieja pregunta: -/ –
No significa que pueda responderla. Idealmente, la mejor respuesta surge incluso después de un tiempo muy largo. Por cierto, tu respuesta solo analiza XML, no HTML. Debe incluir una instancia de 'HTMLParser'. – phihag
phihag: Solucionado. También funciona con HTML, siempre que el documento contenga el texto que queremos analizar. –
Los resultados más estables que he tenido han sido el uso del mezclador de sopa lxml.html. Tendrá que instalar Python-lxml y python-BeautifulSoup, a continuación, puede hacer lo siguiente:
- 1. Expresiones Parse XPath
- 2. Parse html usando C
- 3. Cómo ordenar valores a través de XPath
- 4. ¿Parse la tabla HTML a la lista de Python?
- 5. Parse XML con XPath y espacios de nombres en Java
- 6. XPath lxml de tabla html
- 7. Sitio web de Parse HTML con JAVA
- 8. HTML Treebuilder XPath para extraer enlaces
- 9. Parse HTML "estilo" atributo usando Java
- 10. C# HTMLAgilityPack HTML to Text - Parse Errors
- 11. Parse página completa html con jQuery
- 12. Cambiar URL a través de html seleccionar
- 13. Actualizando HTML a través de JSON/AJAX
- 14. Huelga a través de correos electrónicos HTML
- 15. pitón, lxml y XPath - html tabla de análisis sintáctico
- 16. obtener clics a través del lienzo html
- 17. acceder al elemento html usando xpath
- 18. Usando XPath Contiene contra HTML en Java
- 19. php simple html dom parse img atributos html5?
- 20. Java: cómo ubicar un elemento a través de xpath string en org.w3c.dom.document
- 21. Velocity #parse pero asígnelo a una variable
- 22. Parse a tuple from a string?
- 23. Parse html table using file_get_contents to php array
- 24. ¿Cómo iterar a través de los elementos DOM que coinciden con una clase css utilizando xpath?
- 25. eliminación de estilos de elemento html a través de javascript
- 26. nuevo cromo ventana de incógnito a través de HTML/JS
- 27. cuadros de texto Alinear a través de HTML
- 28. Transmisión de video con HTML 5 a través de node.js
- 29. Generación dinámica de formularios HTML a través de GUI
- 30. Parse String to Double.NaN
Es posible que desee considerar lxml para Python ahora –
** ¡Peligro!** Use el analizador BeautifulSoup para lxml, ya que elementtidy se ahogará en los espacios de nombres que no están declarados. ¡Aprendí de la manera difícil! –