Quizás algún día necesite obtener información de un sitio web o un documento HTML en su aplicación, y diré sin más preámbulos que usar la biblioteca jsoup simplificará enormemente su tarea. Según la wiki , jsoup es una biblioteca Java de código abierto diseñada para analizar, extraer y manipular datos almacenados en documentos HTML.
Comienzo rápido
La biblioteca se puede descargar como un archivo jar y colocar en un proyecto, o conectarse usando Maven/Gradle. Dejaré un enlace al sitio web oficial al final del artículo: allí podrás encontrar la versión actual de la biblioteca. En el ejemplo usaremos la conexión a través de Maven. Agreguemos una dependencia:<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.11.3</version>
</dependency>
Uso
En primer lugar, debe obtener una instancia de la claseDocument
de org.jsoup.nodes.Document que indique la fuente para el análisis. Puede ser un archivo local o un enlace. Por ejemplo, en este artículo usaremos el sitio web yandex.ru e intentaremos obtener sus noticias actuales:
Document doc = Jsoup.connect("https://yandex.ru/")
.userAgent("Chrome/4.0.249.0 Safari/532.5")
.referrer("http://www.google.com")
.get();
User Agent
es un identificador que se comunica al sitio que se visita. En muchos sitios es el criterio más importante para el filtro antispam. Referrer
contiene la URL de la fuente de la solicitud. El método get()
genera una IOException manejada, por lo que podemos envolver todo en try/catch
un bloque o simplemente lanzarlo más lejos con throws
. Ahora hemos recibido el código fuente de esta página. Si es necesario, la propia biblioteca jsoup puede restaurar los elementos dañados. Ahora todo lo que tenemos que hacer es limitar la búsqueda a un bloque separado. El método select()
tiene una gran selección de usos: le permite buscar elementos por etiqueta, atributos, clase y otros parámetros. Casi todos los navegadores modernos admiten la posibilidad de buscar rápidamente el código fuente de un elemento seleccionado. Con manipulaciones simples, encontramos el código fuente del elemento que necesitamos y obtenemos div
un bloque con la clase especificada, que usaremos para el muestreo. Usemos la clase Elements
de org.jsoup.select.Elements para seleccionar todos los elementos de nuestro bloque seleccionado.
Elements listNews = doc.select("div#tabnews_newsc.content-tabs__items.content-tabs__items_active_true");
Ahora tenemos algo como esto: Ahora todo lo que tenemos que hacer es usar un pequeño bucle para recorrer todos los elementos:
for (Element element : listNews.select("a"))
System.out.println(element.text());
El método text()
le permite descartar el código de marcado y deja solo una combinación de texto para todos los elementos entrantes. El resultado de la ejecución será el siguiente: Es fácil notar que el número real de filas recibidas no corresponde a la visualización real en la página. Aquí es donde residen los peligros. Si observa el código fuente del marcado, notará que las últimas noticias cambian animadamente en un intervalo de tiempo determinado. Algunas de estas “piedras” se resuelven mediante muestreos adicionales y, por supuesto, pruebas. Puede resultar que los primeros cinco elementos contengan la información que necesitamos y que el sexto elemento solo contenga una línea vacía escrita. También sucede que los bloques no tendrán ningún identificador, entonces es posible apuntar directamente mediante un método get(int index)
al número de posición del elemento en cuestión.
System.out.println(listNews.select("a").get(2).text());
GO TO FULL VERSION