Peut-être qu'un jour vous aurez besoin d'obtenir des informations à partir d'un site Web ou d'un document HTML dans votre application, et je dirai sans plus tarder que l'utilisation de la bibliothèque jsoup simplifiera grandement votre tâche. Selon le wiki , jsoup est une bibliothèque Java open source conçue pour analyser, extraire et manipuler les données stockées dans des documents HTML.
Départ rapide
La bibliothèque peut être téléchargée sous forme de fichier jar et placée dans un projet, ou connectée à l'aide de Maven/Gradle. Je laisserai un lien vers le site officiel à la fin de l'article : vous y trouverez la version actuelle de la bibliothèque. Dans l'exemple nous utiliserons la connexion via Maven. Ajoutons une dépendance :<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.11.3</version>
</dependency>
Usage
Tout d'abord, vous devez obtenir une instance de la classeDocument
à partir de org.jsoup.nodes.Document indiquant la source de l'analyse. Il peut s'agir d'un fichier local ou d'un lien. Par exemple, dans cet article, nous utiliserons le site Web yandex.ru et essaierons d'obtenir leur fil d'actualité actuel :
Document doc = Jsoup.connect("https://yandex.ru/")
.userAgent("Chrome/4.0.249.0 Safari/532.5")
.referrer("http://www.google.com")
.get();
User Agent
est un identifiant qui est communiqué au site visité. Sur de nombreux sites, c'est le critère le plus important pour le filtre antispam. Referrer
contient l'URL de la source de la requête. La méthode get()
renvoie une IOException gérée, afin que nous puissions tout envelopper dans try/catch
un bloc, ou simplement la lancer plus loin avec throws
. Nous avons maintenant reçu le code source de cette page. Si nécessaire, la bibliothèque jsoup elle-même peut restaurer les éléments endommagés. Il ne nous reste plus qu'à limiter la recherche à un bloc distinct. La méthode select()
a un large choix d'utilisations : elle permet de rechercher des éléments par balise, attributs, classe et autres paramètres. Presque tous les navigateurs modernes prennent en charge la possibilité de rechercher rapidement le code source d'un élément sélectionné. Avec des manipulations simples, nous trouvons le code source de l'élément dont nous avons besoin et obtenons div
un bloc avec la classe spécifiée, que nous utiliserons pour l'échantillonnage. Utilisons la classe Elements
de org.jsoup.select.Elements pour sélectionner tous les éléments de notre bloc sélectionné.
Elements listNews = doc.select("div#tabnews_newsc.content-tabs__items.content-tabs__items_active_true");
Nous avons maintenant quelque chose comme ceci : Il ne nous reste plus qu'à utiliser une petite boucle pour parcourir tous les éléments :
for (Element element : listNews.select("a"))
System.out.println(element.text());
La méthode text()
vous permet de supprimer le code de balisage et ne laisse qu'une combinaison de texte pour tous les éléments entrants. Le résultat de l'exécution sera le suivant : Il est facile de constater que le nombre réel de lignes reçues ne correspond pas à l'affichage réel sur la page. C’est là que résident les pièges. Si vous regardez le code source du balisage, vous remarquerez que les dernières nouvelles changent de manière animée à un certain intervalle de temps. Certains de ces « problèmes » sont résolus par des échantillonnages supplémentaires et, bien sûr, par des tests. Il se peut que les cinq premiers éléments contiennent les informations dont nous avons besoin et que le sixième élément ne contienne qu'une ligne vide scriptée. Il arrive aussi que des blocs n'aient pas d'identifiant, il est alors possible de pointer directement grâce à une méthode get(int index)
le numéro de position de l'élément en question.
System.out.println(listNews.select("a").get(2).text());
GO TO FULL VERSION