簡體   English   中英

Jsoup.parse()。text()添加不需要的空格

[英]Jsoup.parse().text() add not desired whitespace

我試圖清理一個字符串,從其中刪除所有html標記,所以這是我的代碼:

System.out.println("Result:" + Jsoup.parse("Dani<div></div>el").text());    

結果是

Result:Dani el

相反應該是Result:Daniel

按照Jsoup代碼,我發現此方法中的“問題”在org.jsoup.nodes.Element中:

public String text() {
    final StringBuilder accum = new StringBuilder();
    new NodeTraversor(new NodeVisitor() {
        public void head(Node node, int depth) {
            if (node instanceof TextNode) {
                TextNode textNode = (TextNode) node;
                appendNormalisedText(accum, textNode);
            } else if (node instanceof Element) {
                Element element = (Element) node;
                if (accum.length() > 0 &&
                    (element.isBlock() || element.tag.getName().equals("br")) &&
                    !TextNode.lastCharIsWhitespace(accum))
                    accum.append(" ");
            }
        }

        public void tail(Node node, int depth) {
        }
    }).traverse(this);
    return accum.toString().trim();
}

在某個時候有accum.append(" "); 很明顯,在某些情況下,一個html塊標記在相應的文本版本中添加一個空格很方便; 但在某些情況下,這是不正確的。 就我而言,結果是錯誤的。

我覺得這是很好的文本()方法有一個boolean參數preserveWhiteSpaces是啟用或禁用該行的執行accum.append(" "); 我希望Jsoup的某些開發人員可以考慮此請求:我看到其他人也對空白存在此問題。

如果有人有一個好主意來解決問題而不進行更改,那么歡迎使用Jsoup來源。

我正在嘗試清理一個字符串,從中刪除所有html標簽,

您要使用clean()方法。

樣本代碼

System.out.println("Result:" + Jsoup.clean("Dani<div></div>el", Whitelist.none()));

輸出值

Result:Daniel

在我看來,結果是錯誤的。 您是否有解決此問題的建議?

您可以使用自定義NodeVisitor實例化NodeTraversor

只是給你一個想法:

private static String toText(Element element) {
    final StringBuilder accum = new StringBuilder();
    new NodeTraversor(new NodeVisitor() {
        public void head(Node node, int depth) {
            if (node instanceof TextNode) {
                TextNode textNode = (TextNode) node;
                accum.append(textNode.getWholeText());
            } else if (node instanceof Element) {
                // Do nothing ...
            }
        }

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

    return accum.toString().trim();
}

樣本代碼

public static void main(String[] args) {
    System.out.println("Result:" + toText(Jsoup.parse("Dani<div></div>el")));
}

輸出值

Result:Daniel

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM