Disons que j'ai un fragment html comme celui-ci:
<p> <span> foo </span> <em> bar <a> foobar </a> baz </em> </p>
Ce que je veux en extraire c'est:
foo bar foobar baz
Donc, ma question est: comment puis-je supprimer toutes les balises d'habillage d'un html et obtenir uniquement le texte dans le même ordre que dans le html? Comme vous pouvez le voir dans le titre, je veux utiliser jsoup pour l'analyse.
Exemple pour html accentué (notez le caractère 'á'):
<p><strong>Tarthatatlan biztonsági viszonyok</strong></p>
<p><strong>Tarthatatlan biztonsági viszonyok</strong></p>
Ce que je veux:
Tarthatatlan biztonsági viszonyok
Tarthatatlan biztonsági viszonyok
Ce html n'est pas statique, généralement je veux juste chaque texte d'un fragment html générique sous forme lisible par l'homme décodé, les sauts de ligne de largeur.
Avec Jsoup:
final String html = "<p> <span> foo </span> <em> bar <a> foobar </a> baz </em> </p>";
Document doc = Jsoup.parse(html);
System.out.println(doc.text());
Sortie:
foo bar foobar baz
Si vous ne voulez que le texte de p-tag, utilisez-le à la place de doc.text()
:
doc.select("p").text();
... ou seul corps:
doc.body().text();
final String html = "<p><strong>Tarthatatlan biztonsági viszonyok</strong></p>"
+ "<p><strong>Tarthatatlan biztonsági viszonyok</strong></p>";
Document doc = Jsoup.parse(html);
for( Element element : doc.select("p") )
{
System.out.println(element.text());
// eg. you can use a StringBuilder and append lines here ...
}
Sortie:
Tarthatatlan biztonsági viszonyok
Tarthatatlan biztonsági viszonyok
en utilisant Regex: -
String str = "<p> <span> foo </span> <em> bar <a> foobar </a> baz </em> </p>";
str = str.replaceAll("<[^>]*>", "");
System.out.println(str);
[~ # ~] sortie [~ # ~] : -
foo bar foobar baz
en utilisant Jsoup: -
Document doc = Jsoup.parse(str);
String text = doc.text();
En fait, la bonne façon de nettoyer avec Jsoup est via une liste blanche
...
final String html = "<p> <span> foo </span> <em> bar <a> foobar </a> baz </em> </p>";
Document doc = Jsoup.parse(html);
Whitelist wl = new Whitelist().none()
String cleanText = new Jsoup().clean(doc ,wl)
Si vous souhaitez conserver certaines balises:
Whitelist wl = new Whitelist().relaxed().removeTags("a")