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.