¿Cuáles son los pros y los contras de los principales analizadores HTML de Java? [cerrado]

175

Al buscar SO y Google, descubrí que hay algunos analizadores HTML de Java que varias partes recomiendan constantemente. Desafortunadamente, es difícil encontrar información sobre las fortalezas y debilidades de las diversas bibliotecas. Espero que algunas personas hayan pasado un poco 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, también me encantaría conocer sus ventajas y desventajas.

¡Gracias!

Avi Flax
fuente

Respuestas:

223

General

Casi todos los analizadores HTML conocidos implementan la API DOM W3C (parte de la API JAXP, la API Java para el procesamiento de XML) y le brindan un org.w3c.dom.Documentrespaldo que está listo para su uso directo por la API JAXP. Las principales diferencias se encuentran generalmente en las características del analizador en cuestión. La mayoría de los analizadores son, hasta cierto punto, indulgentes e indulgentes con HTML mal formado ("tagoup"), como JTidy , NekoHTML , TagSoup y HtmlCleaner . Por lo general, utiliza este tipo de analizadores HTML para "ordenar" la fuente HTML (por ejemplo, reemplazar el HTML válido <br>por un XML válido <br />), de modo que pueda recorrerlo "de la manera habitual" utilizando el W3C DOM y la API JAXP.

Los únicos que saltan 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, ingresar valores de formulario, hacer clic en elementos, invocar JavaScript, etc. Es mucho más que solo un analizador HTML. Es un verdadero "navegador web sin GUI" y una herramienta de prueba de unidad HTML.

Jsoup

Jsoup también proporciona una API completamente propia. Le brinda la posibilidad de seleccionar elementos utilizando selectores CSS similares a jQuery y proporciona una API ingeniosa para atravesar el árbol HTML DOM para obtener los elementos de interés.

En particular, el recorrido del árbol HTML DOM es la mayor fortaleza de Jsoup. Los que han trabajado org.w3c.dom.Documentsaben qué dolor es atravesar el DOM utilizando los API detallados NodeListy NodeAPI. Es cierto, XPathhace la vida más fácil, pero aún así, es otra curva de aprendizaje y puede terminar siendo detallada.

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 que responden (estoy usando XPath ya que sin él, el código necesario para 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 solo es menos código, sino que Jsoup también es relativamente fácil de entender si ya tiene una experiencia moderada con los selectores CSS (por ejemplo, desarrollando sitios web y / o usando jQuery).

Resumen

Los pros y los contras de cada uno deberían ser suficientemente claros ahora. Si solo desea utilizar la API JAXP estándar para recorrerlo, vaya al primer grupo de analizadores mencionados. Hay muchos de ellos. Cuál elegir depende de las características que proporciona (¿cómo le facilita 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 desea realizar una prueba unitaria del HTML, HtmlUnit es el camino a seguir. Si desea extraer datos específicos del HTML (que es más que un requisito del mundo real), entonces Jsoup es el camino a seguir.

BalusC
fuente
Hay un gran pro / con que se omite aquí: Jericho es el único analizador que conozco que le permite manipular HTML desagradable mientras conserva el formato de espacios en blanco y la incorrección del HTML (si hay alguno).
Adam Gent
3
Jsoupes bueno. Traté de interactuar con otro módulo que funciona con org.w3c.dom.*API. Descubrí que Jsoup no obedece el org.w3c.dom.*contrato
Thamme Gowda
13

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 resultarle útil.

Matt Solnit
fuente
Esta es una respuesta de solo enlace. ¿Puedes agregar los detalles pertinentes aquí?
Restablecer Monica - notmaynard
7

Agregue Validor.nu HTML Parser , una implementación del algoritmo de análisis HTML5 en Java, a su lista.

En el lado positivo, está específicamente diseñado para coincidir con HTML5, y en el corazón del validador HTML5, por lo que es muy probable que coincida con el comportamiento de análisis futuro del navegador con un alto grado de precisión.

En el lado negativo, el análisis heredado de los navegadores no funciona exactamente así, y como HTML5 todavía está en borrador, está sujeto a cambios.

En la práctica, estos problemas solo afectan a los casos oscuros de esquina, y es para todos los fines prácticos, un excelente analizador.

Alohci
fuente
7

Encontré que Jericho HTML Parser está muy bien escrito, actualizado (que muchos de los analizadores no lo están), sin dependencias y fácil de usar.

MJB
fuente
6

Solo agregaré a la respuesta @MJB después de trabajar con la mayoría de las bibliotecas de análisis HTML en Java, hay un gran pro / con que se omite: analizadores que preservan el formato y la incorrección del HTML en la entrada y salida.

Esa es la mayoría de los analizadores cuando cambia el documento eliminará los espacios en blanco, los comentarios y la incorrección del DOM, especialmente si son una biblioteca similar a XML.

Jericho es el único analizador que conozco que le permite manipular HTML desagradable mientras conserva el formato de espacios en blanco y la incorrección del HTML (si hay alguno).

Adam Gent
fuente
3

Otras dos opciones son HTMLCleaner y HTMLParser .

He intentado la mayoría de los analizadores aquí para un marco de extracción de datos / rastreador que he estado desarrollando. Utilizo 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 algunos de los otros analizadores: JSoup, por ejemplo, admite una interfaz similar a DOM, en lugar de DOM, por lo que se requiere un ensamblaje . Jericho tiene una interfaz de línea SAX, así que nuevamente requiere algo de trabajo, aunque Sujit Pal tiene una buena descripción de cómo hacerlo, pero al final HTMLCleaner funcionó mejor.

También uso HTMLParser y Jericho para una tarea de extracción de tabla, que reemplazó parte del código escrito usando libhtml-tableextract-perl de 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 conserva el HTML subyacente. Tiene una especie de interfaz SAX no estándar, por lo que para el procesamiento XPath, HTMLCleaner es mejor.

Analizar HTML en Java es un problema sorprendentemente difícil ya que todos los analizadores parecen tener problemas con ciertos tipos de contenido HTML con formato incorrecto.

Mark Butler
fuente