[java] jsoup을 사용하여 html을 일반 텍스트로 변환 할 때 줄 바꿈을 어떻게 유지합니까?

다음 코드가 있습니다.

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

그리고 결과가 있습니다.

hello world yo googlez

그러나 나는 줄을 끊고 싶다.

hello world
yo googlez

나는 살펴 보았다 jsoup의 TextNode # getWholeText () 하지만 난 그것을 사용하는 방법을 알아낼 수 없습니다.

<br>구문 분석 한 마크 업에 a 가있는 경우 결과 출력에서 ​​줄 바꿈을 어떻게 얻을 수 있습니까?



답변

줄 바꿈을 유지하는 실제 솔루션은 다음과 같아야합니다.

public static String br2nl(String html) {
    if(html==null)
        return html;
    Document document = Jsoup.parse(html);
    document.outputSettings(new Document.OutputSettings().prettyPrint(false));//makes html() preserve linebreaks and spacing
    document.select("br").append("\\n");
    document.select("p").prepend("\\n\\n");
    String s = document.html().replaceAll("\\\\n", "\n");
    return Jsoup.clean(s, "", Whitelist.none(), new Document.OutputSettings().prettyPrint(false));
}

다음 요구 사항을 충족합니다.

  1. 원본 HTML에 newline (\ n)이 포함되어 있으면 보존됩니다.
  2. 원본 html에 br 또는 p 태그가 포함되어 있으면 newline (\ n)으로 변환됩니다.

답변

Jsoup.clean(unsafeString, "", Whitelist.none(), new OutputSettings().prettyPrint(false));

여기에서이 방법을 사용합니다.

public static String clean(String bodyHtml,
                       String baseUri,
                       Whitelist whitelist,
                       Document.OutputSettings outputSettings)

이를 전달함으로써 Whitelist.none()모든 HTML이 제거되었는지 확인합니다.

패스 new OutputSettings().prettyPrint(false)를 통해 출력이 다시 형식화되지 않고 줄 바꿈이 유지되는지 확인합니다.


답변

Jsoup.parse("A\nB").text();

당신은 출력이 있습니다

"A B" 

그리고 아닙니다

A

B

이를 위해 다음을 사용하고 있습니다.

descrizione = Jsoup.parse(html.replaceAll("(?i)<br[^>]*>", "br2n")).text();
text = descrizione.replaceAll("br2n", "\n");


답변

jsoup을 사용하여 이것을 시도하십시오.

public static String cleanPreserveLineBreaks(String bodyHtml) {

    // get pretty printed html with preserved br and p tags
    String prettyPrintedBodyFragment = Jsoup.clean(bodyHtml, "", Whitelist.none().addTags("br", "p"), new OutputSettings().prettyPrint(true));
    // get plain text with preserved line breaks by disabled prettyPrint
    return Jsoup.clean(prettyPrintedBodyFragment, "", Whitelist.none(), new OutputSettings().prettyPrint(false));
}


답변

Jsoup v1.11.2에서 이제 Element.wholeText().

예제 코드 :

String cleanString = Jsoup.parse(htmlString).wholeText();

user121196's 대답은 여전히 작동합니다. 그러나 wholeText()텍스트의 정렬을 유지합니다.


답변

더 복잡한 HTML의 경우 위의 솔루션 중 어느 것도 제대로 작동하지 않았습니다. 줄 바꿈을 유지하면서 변환을 성공적으로 수행 할 수있었습니다.

Document document = Jsoup.parse(myHtml);
String text = new HtmlToPlainText().getPlainText(document);

(버전 1.10.3)


답변

주어진 요소를 순회 할 수 있습니다.

public String convertNodeToText(Element element)
{
    final StringBuilder buffer = new StringBuilder();

    new NodeTraversor(new NodeVisitor() {
        boolean isNewline = true;

        @Override
        public void head(Node node, int depth) {
            if (node instanceof TextNode) {
                TextNode textNode = (TextNode) node;
                String text = textNode.text().replace('\u00A0', ' ').trim();
                if(!text.isEmpty())
                {
                    buffer.append(text);
                    isNewline = false;
                }
            } else if (node instanceof Element) {
                Element element = (Element) node;
                if (!isNewline)
                {
                    if((element.isBlock() || element.tagName().equals("br")))
                    {
                        buffer.append("\n");
                        isNewline = true;
                    }
                }
            }
        }

        @Override
        public void tail(Node node, int depth) {
        }
    }).traverse(element);

    return buffer.toString();
}

그리고 당신의 코드

String result = convertNodeToText(JSoup.parse(html))