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

时间:2016-03-31 17:45:33

标签: java jsoup

我试图清除一个String,从中删除所有的html标签,所以这是我的代码:

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

结果是

Result:Dani el

应该是Result:Daniel

按照Jsoup代码,我看到&#34;问题&#34;在此方法的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标签在相应的文本版本中添加空格是方便的;但在某些情况下,这不是真的。 在我的情况下,结果是错误的。

我认为text()方法有一个布尔参数preserveWhiteSpaces可以启用或禁用行accum.append(" ");的执行。 我希望Jsoup的一些开发人员可以考虑这个请求:我看到其他人也有这个空白问题。

如果有人有一些好主意在没有改变的情况下解决问题,欢迎Jsoup来源。

1 个答案:

答案 0 :(得分:1)

  

我试图清除一个字符串,从中删除所有的html标签,

您想使用clean()方法。

示例代码

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

输出

Result:Daniel
  

但就我而言,结果是错误的。你有什么建议来解决这个问题吗?

您可以使用自定义NodeTraversor实现NodeVisitor

只是为了给你一个想法:

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