ejemplo - text box java
¿Cuáles son los pros y los contras de los principales analizadores de HTML de Java? (6)
General
Casi todos los analizadores de HTML conocidos implementan la API DOM de W3C (parte de la API de JAXP, la API de Java para el procesamiento de XML) y le ofrece un respaldo de org.w3c.dom.Document
que está listo para su uso directo por la API de JAXP. Las principales diferencias suelen encontrarse en las características del analizador en cuestión. La mayoría de los analizadores sintácticos son, hasta cierto punto, indulgentes y indulgentes con el HTML no bien formado ("tagoup"), como JTidy , NekoHTML , TagSoup y HtmlCleaner . Por lo general, utiliza este tipo de analizadores HTML para "ordenar" el código HTML (por ejemplo, reemplazando el HTML-valid por un XML-válido <br />
), para que pueda recorrerlo "de la manera habitual" utilizando el W3C API DOM y JAXP.
Los únicos que jsoup son HtmlUnit y jsoup .
HtmlUnit
HtmlUnit proporciona una API completamente propia que le brinda la posibilidad de actuar como un navegador web mediante programación. Es decir, ingrese los valores del formulario, haga clic en los elementos, invoque JavaScript, etcétera. Es mucho más que solo un analizador de HTML. Es un verdadero "navegador web sin GUI" y una herramienta de prueba de unidades HTML.
Jsoup
jsoup también proporciona una API completamente propia. Le da la posibilidad de seleccionar elementos utilizando jQuery -like selectores de CSS y proporciona una API hábil para recorrer el árbol HTML DOM para obtener los elementos de interés.
En particular, el desplazamiento del árbol HTML DOM es la mayor fortaleza de Jsoup. Los que han trabajado con org.w3c.dom.Document
saben qué doloroso es atravesar el DOM con las detalladas API NodeList
y Node
. Es cierto que XPath
hace la vida más fácil, pero aún así, es otra curva de aprendizaje y puede llegar a ser todavía prolija.
Aquí hay un ejemplo que usa un analizador W3C DOM "simple" como JTidy en combinación con XPath para extraer el primer párrafo de su pregunta y los nombres de todos los contestadores (estoy usando XPath ya que sin él, el código necesitaba recopilar la información de interés de lo contrario, crecería 10 veces más grande, sin escribir métodos de utilidad / ayuda).
String url = "http://stackoverflow.com/questions/3152138";
Document document = new Tidy().parseDOM(new URL(url).openStream(), null);
XPath xpath = XPathFactory.newInstance().newXPath();
Node question = (Node) xpath.compile("//*[@id=''question'']//*[contains(@class,''post-text'')]//p[1]").evaluate(document, XPathConstants.NODE);
System.out.println("Question: " + question.getFirstChild().getNodeValue());
NodeList answerers = (NodeList) xpath.compile("//*[@id=''answers'']//*[contains(@class,''user-details'')]//a[1]").evaluate(document, XPathConstants.NODESET);
for (int i = 0; i < answerers.getLength(); i++) {
System.out.println("Answerer: " + answerers.item(i).getFirstChild().getNodeValue());
}
Y aquí hay un ejemplo de cómo hacer exactamente lo mismo con Jsoup:
String url = "http://stackoverflow.com/questions/3152138";
Document document = Jsoup.connect(url).get();
Element question = document.select("#question .post-text p").first();
System.out.println("Question: " + question.text());
Elements answerers = document.select("#answers .user-details a");
for (Element answerer : answerers) {
System.out.println("Answerer: " + answerer.text());
}
¿Ves la diferencia? No es solo un código menor, pero Jsoup también es relativamente fácil de entender si ya tienes una experiencia moderada con los selectores de CSS (por ejemplo, desarrollando sitios web y / o usando jQuery).
Resumen
Los pros y contras de cada uno deberían ser lo suficientemente claros ahora. Si solo desea utilizar la API JAXP estándar para recorrerla, busque el primer grupo mencionado de analizadores. Hay muchos de ellos. Cuál elegir depende de las características que proporciona (¿cómo se simplifica la limpieza HTML? ¿Hay algunos oyentes / interceptores y limpiadores específicos de etiquetas?) Y la solidez de la biblioteca (¿con qué frecuencia se actualiza / mantiene / repara? ) Si le gusta probar el HTML, entonces HtmlUnit es el camino a seguir. Si desea extraer datos específicos del HTML (que es más que a menudo el requisito del mundo real), entonces Jsoup es el camino a seguir.
Al buscar en SO y Google, descubrí que hay algunos analizadores de HTML Java que son recomendados por varias partes. Lamentablemente, es difícil encontrar información sobre las fortalezas y debilidades de las distintas bibliotecas. Espero que algunas personas hayan pasado comparando estas bibliotecas y puedan compartir lo que han aprendido.
Esto es lo que he visto:
Y si hay un analizador importante que me he perdido, me encantaría conocer sus ventajas y desventajas también.
¡Gracias!
Añada The validator.nu HTML Parser , una implementación del algoritmo de análisis HTML5 en Java, a su lista.
En el lado positivo, está diseñado específicamente para que coincida con HTML5, y en el corazón del validador de HTML5, por lo que es muy probable que combine el comportamiento de análisis del futuro navegador con un alto grado de precisión.
En el lado negativo, el análisis heredado de los navegadores no funciona exactamente como este, y como HTML5 todavía está en borrador, está sujeto a cambios.
En la práctica, tales problemas solo afectan casos de esquina oscuros, y es para todos los propósitos prácticos, un analizador excelente.
Encontré que Jericho HTML Parser está muy bien escrito, actualizado (lo que muchos de los analizadores no son), sin dependencias y fácil de usar.
Otras dos opciones son HtmlCleaner y HTMLParser .
He intentado la mayoría de los analizadores aquí para un marco de extracción de datos / rastreo que he estado desarrollando. Uso HTMLCleaner para la mayor parte del trabajo de extracción de datos. Esto se debe a que admite un dialecto razonablemente moderno de HTML, XHTML, HTML 5, con espacios de nombres, y admite DOM, por lo que es posible usarlo con la implementación XPath integrada de Java .
Es mucho más fácil hacer esto con HTMLCleaner que con algunos de los otros analizadores: por ejemplo, JSoup admite una interfaz similar a DOM, en lugar de DOM, por lo que se requiere cierto ensamblaje . Jericho tiene una interfaz de línea SAX, así que de nuevo requiere algo de trabajo aunque Sujit Pal tiene una buena descripción de cómo hacerlo, pero al final HTMLCleaner simplemente funcionó mejor.
También uso HTMLParser y Jericho para una tarea de extracción de tablas, que reemplazó algún código escrito usando libhtml-tableextract-perl . Uso HTMLParser para filtrar el HTML de la tabla, luego uso Jericho para analizarlo. Estoy de acuerdo con los comentarios de MJB y Adam de que Jericho es bueno en algunos casos porque preserva el HTML subyacente. Tiene una especie de interfaz SAX no estándar, por lo que para el procesamiento XPath, HTMLCleaner es mejor.
El análisis de HTML en Java es un problema sorprendentemente difícil ya que todos los analizadores parecen tener problemas con ciertos tipos de contenido HTML mal formado.
Voy a agregar a la respuesta @MJB después de trabajar con la mayoría de las bibliotecas de análisis HTML en Java, hay una gran pro / con que se omite: analizadores que conservan el formato y la incorrección del HTML en la entrada y salida.
Es decir, la mayoría de los analizadores sintácticos cuando se cambia el documento eliminarán el espacio en blanco, los comentarios y la incorrección del DOM, especialmente si se trata de una biblioteca de tipo XML.
Jericho es el único analizador que conozco que te permite manipular HTML desagradable mientras se preserva el formato de espacio en blanco y la incorrección del HTML (si hay alguno).
Este artículo compara ciertos aspectos de los siguientes analizadores:
- NekoHTML
- JTidy
- TagSoup
- HtmlCleaner
De ninguna manera es un resumen completo, y es de 2008. Pero puede que le sea útil.