Bonjour,
Je cherche à supprimer toutes les balises d'un fichier HTML avec JAVA. Seriez-vous comment faire?:lol:
Merci d'avance,
Owl___
Version imprimable
Bonjour,
Je cherche à supprimer toutes les balises d'un fichier HTML avec JAVA. Seriez-vous comment faire?:lol:
Merci d'avance,
Owl___
Salut, tu peux utiliser une expression régulière.
Salut,
On pourrait le faire avec une expression régulière, pour du HTML de base, sans JavaScript. Et encore, il faudra éventuellement un code préparatoire pour récupérer le body, parce que je suppose qu'on ne veut pas les contenus de la balise <head>. Et traiter les conversions des entités. Etc.
Le plus simple est d'utiliser un parser. Par exemple, avec la bibliothèque JSoup, à partir d'une String qui contient du HTML :
Tu voudras peut-être même avoir les différents paragraphes, avec retour à la ligne :Code:
1
2
3
4 public static String htmlToString(String html) { return Jsoup.parse(html).body().text(); }
Voire même obtenir un texte structuré, avec les listes, les puces, les tableaux alignés, tout ça est possible relativement facilement avec JSoup.Code:
1
2
3
4
5
6
7 public static String htmlToText(String html) { StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); Jsoup.parse(html).body().select("p").stream().map(Element::text).forEach(pw::println); return sw.toString(); }
Ou seulement traiter chaque élément séparément d'ailleurs.
Bonjour,
Merci pour votre réponse. Je dois récupérer le fichier html comme cela avec un FileReader?
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13 import java.io.*; class new30{ FileReader html; html = new FileReader("new.html"); public static String htmlToText(string html) { StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(); Jsoup.parse(html).body().select("p").stream().map(Element::text).forEach(pw::println); return sw.toString(); } }
En Java 13,
Il te suffit d'utiliser la méthode java.nio.file.Files.readString() :
Avant, on peut utiliser un FileReader/BufferedReader, via Files.newBufferedReader(), mais le plus simple est de récupérer les lignes et les joindre :Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 public static void exemple() { try { String text = htmlToText(Files.readString(Paths.get("/chemin/fichier.html"))); } catch (IOException e) { e.printStackTrace(); } } public static String htmlToText(String html) { StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); Jsoup.parse(html).body().select("p").stream().map(Element::text).forEach(pw::println); return sw.toString(); }
Code:
1
2
3
4
5 try { String text = htmlToText(Files.lines(Paths.get("/chemin/fichier.html")).collect(Collectors.joining())); } catch (IOException e) { e.printStackTrace(); }
J'obtiens les erreurs ci-jointes dans la capture. Une chose aussi quelle est la bibliothèque pour Jsoup?Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 import java.io.*; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.Files; import java.io.IOException; import java.io.IOException; //import org.jsoup.Jsoup; //import org.jsoup.nodes.Document; public class new30{ public static void exemple() { try { String text = htmlToText(Files.lines(Paths.get("new.html")).collect(Collectors.joining())); } catch (IOException e) { e.printStackTrace(); } } public static String htmlToText(String html) { StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); Jsoup.parse(html).body().select("p").stream().map(Element::text).forEach(pw::println); return sw.toString(); } }
Mon fichier s'appelle new.html c'est le code source d'un site web auquel je dois enlever les balises ainsi que leur contenu.
Il faut ajouter les imports nécessaires :
- Il faut ajouter les imports nécessaires :
Code:
1
2
3
4
5
6 import java.io.IOException; import java.io.PrintWriter; import java.io.StringWriter; import java.nio.file.Files; import java.nio.file.Paths; import java.util.stream.Collectors;
- Pour télécharger jsoup :arrow: https://jsoup.org/download, le core suffit, penser à l'ajouter au classpath lors du lancement de la commande (par le paramètre -cp) et penser aux imports des classes jsoup dans le code :
Code:
1
2 import org.jsoup.Jsoup; import org.jsoup.nodes.Element;
Je n'arrive pas à obtenir de résultat. Je dois mettre le fichier un fichier txt en parametre dans htmlToText dans le main?Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38 import java.io.*; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.Files; import java.io.IOException; import java.io.IOException; import java.io.IOException; import java.io.PrintWriter; import java.io.StringWriter; import java.nio.file.Files; import java.nio.file.Paths; import java.util.stream.Collectors; import org.jsoup.Jsoup; import org.jsoup.nodes.Element; public class new30{ public static void exemple() { try { String text = htmlToText(Files.lines(Paths.get("new.html")).collect(Collectors.joining())); } catch (IOException e) { e.printStackTrace(); } } public static String htmlToText(String html) { StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); Jsoup.parse(html).body().select("p").stream().map(Element::text).forEach(pw::println); return sw.toString(); } public static void main(String[] args){ htmlToText("test.txt"); } }
Ce code, c'est le code que j'ai donné comme exemple pour lire un fichier appelé new.html se trouvant dans le dossier de travail de l'application !Code:
1
2
3
4
5
6
7
8 public static void exemple() { try { String text = htmlToText(Files.lines(Paths.get("new.html")).collect(Collectors.joining())); } catch (IOException e) { e.printStackTrace(); } }
Ta méthode main, ci-dessous, appelle directement une méthode qui prend un String contenant du html pour la transformer en texte débalisé (suivant une règle particulière, qui est de prendre tous les contenus des paragraphes) :
Forcément, test.txt c'est pas du html, c'est du texte, sans balises !Code:
1
2
3
4 public static void main(String[] args){ htmlToText("test.txt"); }
Il faut que tu écrives dans la méthode main un code similaire à ce que j'ai mis dans la méthode exemple, avec le chemin de fichier qui correspond à ton fichier.