web-dev-qa-db-fra.com

jsoup - supprime toutes les balises de mise en forme et de lien, ne conserve que le texte

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.

38
WonderCsabo

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();

Saut de ligne:

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
52
ollo

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();
12
Rohit Jain

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")
4
Al-Punk