Jsoup - Extraire et parser le code HTML en Java
Jsoup est une libraire de Java qui traite le code HTML. C'est une API très pratique pour l'extraction et la manipulation des données en utilisant les meilleurs méthodes de DOM, CSS et jquery.
jsoup implémente les caractéristiques de HTML5 et analyse le code HTML dans un arbre(DOM) comme le font les navigateurs récents. jsoup est un projet open source distribué sous le licence MIT. Vous pouvez trouver le code source dans GitHub.
Caractéristiques:
- Analyser un code HTML à partir d'un URL, fichier ou chaine de caractères.- Trouver et extraire les données en utilisant l'arbre DOM et le CSS.
- Manipuler les éléments et le texte HTML.
- Empêcher les attaques XSS en effaçant la suscription de l'utilisateur.
- Créer un code HTML rangé.
JSoup est conçue pour être adaptée avec les différentes versions de HTML, elle crée un arbre analysé.
Cliquez pour Télécharger jsoup.
Exemple:
Récupérer la page Wikipedia, la transformer et l'analyser sous forme de DOM, et sélectionner à partir de la section news une liste d'éléments.
Document doc = Jsoup.connect("http://fr.wikipedia.org").get();
1 - L'analyse d'un document
Ce code est pour analyser un document HTML:
String html = "<html><head><title>premier Titre</title></head>"
+ "<body><p>Exemple du code vers un document</p></body></html>";
Document doc = Jsoup.parse(html);
+ "<body><p>Exemple du code vers un document</p></body></html>";
Document doc = Jsoup.parse(html);
Le parseur va faire son possible pour créer un code HTML bien clair à partir du code que vous avez fournit, il gère:
- Les balises non fermées par exemple: <p>blabla transformer en <p>blabla</p>
- Les balises implicites par exemple:
<td> table </td> est entouré de <table> <tr><td>
- La structure du code créée respecte les normes du langage HTML (head, body et les éléments qui constituent la page).
- Les balises non fermées par exemple: <p>blabla transformer en <p>blabla</p>
- Les balises implicites par exemple:
<td> table </td> est entouré de <table> <tr><td>
- La structure du code créée respecte les normes du langage HTML (head, body et les éléments qui constituent la page).
2- Analyser un document à partir d'un String
On a le HTML dans un String Java et on veut le décomposer pour avoir son contenu, ou pour vérifier s'il est bien écrit, ou pour le modifier. On peut lire l'entrée à partir d'un fichier ou un lien du web.
Il faut utiliser la méthode prédéfinie Jsoup.parse(String html) ou Jsoup.parse(String html, String Uri) si la page vient du web. Voir classe Jsoup.
String html = "<html><head><title>Titre</title></head>"
+ "<body><p>html en doc</p></body></html>";
Document doc = Jsoup.parse(html);
+ "<body><p>html en doc</p></body></html>";
Document doc = Jsoup.parse(html);
La méthode Jsoup.parse(String html, String Uri) analyse l'entrée du code HTML dans un nouveau Document. L'argument URI est utilisé pour transformer les URLs relative en URLs absolus et devrait être initialisé avec l'url dont le document a été récupéré. Si ce n'est pas possible, vous pouvez utiliser la méthode Jsoup.parse(String html).
Le String passé en paramètre ne doit pas être nul et le document en sortie sera constitué en moins de head et de body. Si vous obturerez une exception ou vous trouverez que l’extraction de l'arbre ne se fait pas correctement, lisez la documentation pour avoir plus d'informations.
Une fois que vous aurez le Document, vous pourrez récupérer les données avec les méthodes de la classe Document et les classes supérieurs Node et Element.
3- Analyser la balise body
On a un morceau de body que l'on veut l'analyser. Le code peut contenir des éléments qui ne sont pas par exemple du code HTML comme les commentaires.
La solution est d'utiliser la méthode Jsoup.parseBodyFragment(String html).
String html = "<div><p> paragraphe </p>";
Document doc = Jsoup.parseBodyFragment(html);
Element body = doc.body();
Document doc = Jsoup.parseBodyFragment(html);
Element body = doc.body();
La méthode parseBodyFragment crée un document vide et insère le HTML analysé dans le body. Si vous utilisez la méthode Jsoup.parse(String html), vous aurez le même résultat, mais le traitement de la sortie comme un fragment body assure que tous les éléments fournis ont été analysés.
La méthode Document.body() récupère les éléments inférieur(enfant) du body, elle est équivalente à doc.getElementsByTag("body").
Il est conseillé de rester prudent lorsque vous récupérez les données à partir des sites qui contiennent des script malveillant. Voir la documentation de la liste blanche et avec la commande clean(String html, Whitelist whitelist).
4- Charger un document à partir d'un URL
Pour rechercher et analyser un document HTML à partir du web et en trouver les données, il faut utiliser la méthode Jsoup.connect(String url).
Document doc = Jsoup.connect("http://siteweb.com/").get();
String title = doc.title();
La méthode connect(String url) crée une nouvelle connexion et get() cherche et analyse le fichier HTML. Si une erreur apparue pendant la recherche, une exception va être déclenchée.
L’interface connexion est conçu en chaînage pour avoir un réponse spécifique :
Document doc = Jsoup.connect("http://siteweb.com")
.data("query", "Java")
.userAgent("Mozilla")
.cookie("auth", "token")
.timeout(3000)
.post();
Cette méthode supporte seulement les URLs des protocoles http et https. Si vous avez besoin de charger un fichier, il vaut mieux utiliser la méthode parse(File in, String charsetName).
5- Charger un document à partir d’un fichier
On a un fichier qui contient du HTML et on veut le charger puis l’analyser et extraire les données pour les manipuler. Il faut utiliser la méthode Jsoup.parse(File in, String encodage, String Uri).
File input = new File("/temp/siteinput.html");
Document doc = Jsoup.parse(siteinput, "UTF-8", "http://siteweb.com/");
Le paramètre Uri est utilisé pour résoudre les URLs relatives dans le document avant que l’élément <base href> soit trouvé. Vous pouvez faire passer un String vide.
Il existe une autre méthode similaire parse(File in, String encodage). La méthode parse() utilise le chemin du fichier comme un Uri. Cette méthode est efficace lorsque vous travaillez sur un serveur local.