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.Document
respaldo 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.Document
saben qué dolor es atravesar el DOM utilizando los API detallados NodeList
y Node
API. Es cierto, XPath
hace 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.
Jsoup
es bueno. Traté de interactuar con otro módulo que funciona conorg.w3c.dom.*
API. Descubrí que Jsoup no obedece elorg.w3c.dom.*
contratoEste artículo compara ciertos aspectos de los siguientes analizadores:
De ninguna manera es un resumen completo, y es de 2008. Pero puede resultarle útil.
fuente
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.
fuente
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.
fuente
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).
fuente
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.
fuente