我试图清除一个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来源。
答案 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