Ich habe folgenden Code:
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)));
}
Und ich habe das Ergebnis:
hello world yo googlez
Aber ich möchte die Grenze brechen:
hello world
yo googlez
Ich habe mir jsoups TextNode # getWholeText () angesehen , kann aber nicht herausfinden, wie ich ihn verwenden soll.
<br>
Wie kann ich einen Zeilenumbruch in meiner resultierenden Ausgabe erzielen, wenn das von mir analysierte Markup ein Zeilenumbruch enthält?
Antworten:
Die wirkliche Lösung, die Zeilenumbrüche bewahrt, sollte folgendermaßen aussehen:
Es erfüllt folgende Anforderungen:
quelle
for (Element e : document.select("br")) e.after(new TextNode("\n", ""));
Anhängen einer echten Newline und nicht der Sequenz \ n? Siehe Node :: after () und Elements :: append () für den Unterschied. DasreplaceAll()
wird in diesem Fall nicht benötigt. Ähnliches gilt für p und andere Blockelemente.Wir verwenden diese Methode hier:
Indem
Whitelist.none()
wir es übergeben, stellen wir sicher, dass alles HTML entfernt wird.Durch Passing stellen
new OutputSettings().prettyPrint(false)
wir sicher, dass die Ausgabe nicht neu formatiert wird und Zeilenumbrüche erhalten bleiben.quelle
br
Tags neue Zeilen erzeugen. Was über alle anderen Blockelemente in HTML wiediv
,p
,ul
etc? Alle von ihnen führen auch neue Linien ein.Mit
Sie haben ausgegeben
und nicht
Dafür benutze ich:
quelle
<br>
Elemente durch Textknoten ersetzen , die neue Zeilen enthalten, und dann aufrufen,.text()
anstatt eine Regex-Transformation durchzuführen, die bei einigen Zeichenfolgen wie<div title=<br>'not an attribute'></div>
Versuchen Sie dies mit jsoup:
quelle
new Document.OutputSettings().prettyPrint(true)
Auf Jsoup v1.11.2 können wir jetzt verwenden
Element.wholeText()
.Beispielcode:
user121196's
Antwort funktioniert immer noch. AberwholeText()
bewahrt die Ausrichtung von Texten.quelle
Für komplexeres HTML funktionierte keine der oben genannten Lösungen ganz richtig. Ich konnte die Konvertierung erfolgreich durchführen und dabei Zeilenumbrüche beibehalten mit:
(Version 1.10.3)
quelle
Sie können ein bestimmtes Element durchlaufen
Und für deinen Code
quelle
isBlock
in sindtail(node, depth)
, und\n
beim Verlassen des Blocks anhängen , anstatt ihn zu betreten? Ich mache das (dh benutzetail
) und das funktioniert gut. Wenn ich jedochhead
wie Sie verwende, wird<p>line one<p>line two
Folgendes als einzelne Zeile angezeigt.funktioniert, wenn das HTML selbst nicht "br2n" enthält
So,
arbeitet zuverlässiger und einfacher.
quelle
Versuchen Sie dies mit jsoup:
quelle
Verwenden Sie
textNodes()
diese Option , um eine Liste der Textknoten abzurufen. Dann verketten Sie sie mit\n
als Trennzeichen. Hier ist ein Scala-Code, den ich dafür verwende. Der Java-Port sollte einfach sein:quelle
Basierend auf den anderen Antworten und den Kommentaren zu dieser Frage scheinen die meisten Leute, die hierher kommen, wirklich nach einer allgemeinen Lösung zu suchen, die eine schön formatierte Klartextdarstellung eines HTML-Dokuments bietet. Ich weiß, dass ich es war.
Glücklicherweise bietet JSoup bereits ein ziemlich umfassendes Beispiel dafür: HtmlToPlainText.java
Das Beispiel
FormattingVisitor
kann leicht nach Ihren Wünschen angepasst werden und behandelt die meisten Blockelemente und Zeilenumbrüche.Um Link Rot zu vermeiden, ist hier die vollständige Lösung von Jonathan Hedley :
quelle
Dies ist meine Version der Übersetzung von HTML in Text (die geänderte Version der Antwort von user121196).
Dies bewahrt nicht nur Zeilenumbrüche, sondern formatiert auch Text und entfernt übermäßige Zeilenumbrüche, HTML-Escape-Symbole, und Sie erhalten ein viel besseres Ergebnis aus Ihrem HTML-Code (in meinem Fall erhalte ich ihn per E-Mail).
Es ist ursprünglich in Scala geschrieben, aber Sie können es leicht in Java ändern
quelle
Versuche dies:
quelle
Wird verwendet, indem mit dem betreffenden HTML-Code aufgerufen wird, der das br zusammen mit der Zeichenfolge enthält, die Sie als temporären Platzhalter für Zeilenumbrüche verwenden möchten. Beispielsweise:
Durch die Rekursion wird sichergestellt, dass die Zeichenfolge, die Sie als Platzhalter für Zeilenumbrüche / Zeilenumbrüche verwenden, niemals im Quell-HTML enthalten ist, da weiterhin eine "1" hinzugefügt wird, bis die Linkbreaker-Platzhalterzeichenfolge nicht im HTML-Code gefunden wird. Es wird kein Formatierungsproblem geben, auf das die Jsoup.clean-Methoden mit Sonderzeichen zu stoßen scheinen.
quelle
Basierend auf der Antwort von user121196 und Green Beret mit
select
s und<pre>
s ist die einzige Lösung, die für mich funktioniert ,:quelle