J'ai le code suivant:
public class NewClass {
public String noTags(String str){
return Jsoup.parse(str).text();
}
public static void main(String args[]) {
String strings="<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN \">" +
"<HTML> <HEAD> <TITLE></TITLE> <style>body{ font-size: 12px;font-family: verdana, arial, helvetica, sans-serif;}</style> </HEAD> <BODY><p><b>hello world</b></p><p><br><b>yo</b> <a href=\"http://google.com\">googlez</a></p></BODY> </HTML> ";
NewClass text = new NewClass();
System.out.println((text.noTags(strings)));
}
Et j'ai le résultat:
hello world yo googlez
Mais je veux briser la ligne:
hello world
yo googlez
J'ai regardé TextNode # getWholeText () de jsoup mais je ne peux pas comprendre comment l'utiliser.
S'il y a un <br>
dans le balisage que j'analyse, comment puis-je obtenir un saut de ligne dans ma sortie résultante?
Réponses:
La vraie solution qui préserve les sauts de ligne devrait être comme ceci:
Il satisfait aux exigences suivantes:
la source
for (Element e : document.select("br")) e.after(new TextNode("\n", ""));
ajouter une vraie nouvelle ligne et non la séquence \ n? Voir Node :: after () et Elements :: append () pour la différence. LereplaceAll()
n'est pas nécessaire dans ce cas. Similaire pour p et d'autres éléments de bloc.Nous utilisons cette méthode ici:
En le passant,
Whitelist.none()
nous nous assurons que tout le HTML est supprimé.En passant,
new OutputSettings().prettyPrint(false)
nous nous assurons que la sortie n'est pas reformatée et que les sauts de ligne sont préservés.la source
br
balises produisent de nouvelles lignes. Qu'en est- il de tout autre élément de bloc HTML tels quediv
,p
,ul
etc? Tous introduisent également de nouvelles lignes.Avec
vous avez une sortie
et pas
Pour cela, j'utilise:
la source
<br>
éléments par des nœuds de texte contenant de nouvelles lignes, puis appeler.text()
au lieu de faire une transformation regex qui entraînera une sortie incorrecte pour certaines chaînes comme<div title=<br>'not an attribute'></div>
Essayez ceci en utilisant jsoup:
la source
new Document.OutputSettings().prettyPrint(true)
Sur Jsoup v1.11.2, nous pouvons désormais utiliser
Element.wholeText()
.Exemple de code:
user121196's
La réponse fonctionne toujours. MaiswholeText()
préserve l'alignement des textes.la source
Pour du HTML plus complexe, aucune des solutions ci-dessus ne fonctionnait parfaitement; J'ai pu réussir la conversion tout en préservant les sauts de ligne avec:
(version 1.10.3)
la source
Vous pouvez parcourir un élément donné
Et pour votre code
la source
isBlock
à latail(node, depth)
place et ajouter\n
lorsque vous quittez le bloc plutôt que lorsque vous y entrez? Je fais cela (c'est-à-dire en utilisanttail
) et cela fonctionne très bien. Cependant, si j'utilisehead
comme vous le faites, alors ceci:<p>line one<p>line two
se termine comme une seule ligne.fonctionne si le html lui-même ne contient pas "br2n"
Alors,
fonctionne plus fiable et plus facile.
la source
Essayez ceci en utilisant jsoup:
la source
Utilisez
textNodes()
pour obtenir une liste des nœuds de texte. Puis concaténez-les avec\n
comme séparateur. Voici un code scala que j'utilise pour cela, le port java devrait être simple:la source
Sur la base des autres réponses et des commentaires sur cette question, il semble que la plupart des gens qui viennent ici recherchent vraiment une solution générale qui fournira une représentation en texte brut bien formatée d'un document HTML. Je sais que je l'étais.
Heureusement, JSoup fournit déjà un exemple assez complet de la façon d'y parvenir: HtmlToPlainText.java
L'exemple
FormattingVisitor
peut facilement être modifié selon vos préférences et traite de la plupart des éléments de bloc et de l'habillage de ligne.Pour éviter la pourriture des liens, voici la solution de Jonathan Hedley dans son intégralité:
la source
Ceci est ma version de la traduction html en texte (la version modifiée de la réponse user121196, en fait).
Cela ne préserve pas seulement les sauts de ligne, mais aussi le formatage du texte et la suppression des sauts de ligne excessifs, des symboles d'échappement HTML, et vous obtiendrez un bien meilleur résultat de votre HTML (dans mon cas, je le reçois par courrier).
Il est à l'origine écrit en Scala, mais vous pouvez le changer facilement en Java
la source
Essaye ça:
la source
Utilisé en appelant avec le html en question, contenant le br, ainsi que la chaîne que vous souhaitez utiliser comme espace réservé de nouvelle ligne temporaire. Par exemple:
La récursivité garantira que la chaîne que vous utilisez comme espace réservé de saut de ligne / de saut de ligne ne sera jamais réellement dans le code source html, car elle continuera à ajouter un "1" jusqu'à ce que la chaîne d'espace réservé pour le linkbreaker ne soit pas trouvée dans le code HTML. Il n'aura pas le problème de formatage que les méthodes Jsoup.clean semblent rencontrer avec des caractères spéciaux.
la source
Sur la base de la réponse de user121196 et de Green Beret avec les
select
s et<pre>
s, la seule solution qui fonctionne pour moi est:la source