如何使用Jsoup从文本中仅删除html标签?

时间:2016-01-02 07:30:39

标签: java html out-of-memory jsoup strip

我想用JSOUP从文本中删除只有html标签。我在这里使用了解决方案(my previous question about JSOUP) 但经过一些检查后,我发现JSOUP获得了JAVA堆异常:大型htmls的OutOfMemoryError,但并非所有。例如,它在html 2Mb和10000行上失败。代码在最后一行抛出异常(不在Jsoup.parse上):

public String StripHtml(String html){
  html = html.replace("&lt;", "<").replace("&gt;", ">");
  String[] tags = getAllStandardHtmlTags;
  Document thing = Jsoup.parse(html);
  for (String tag : tags) {
      for (Element elem : thing.getElementsByTag(tag)) {
          elem.parent().insertChildren(elem.siblingIndex(),elem.childNodes());
          elem.remove();
      }
  }
  return thing.html();
}

有没有办法解决它?

4 个答案:

答案 0 :(得分:3)

或者,您可以尝试Jsoup清洁功能。下面的代码将删除传递的html字符串中的所有html标记。

public String StripHtml(String html) {
    return Jsoup.clean(html, Whitelist.none());
}

白名单(Whitelist.none())告诉Jsoup清洁器允许哪些标签。如您所见,此处不允许使用任何html标签。未删除白名单中引用的任何标签。

您可能对其他提供的白名单感兴趣:

可以通过添加标记(请参阅addTags方法)或删除标记(请参阅removeTags方法)来自定义这些基本白名单。

如果你想创建自己的白名单(小心!),可以采用以下方法:

Whitelist myCustomWhitelist = new Whitelist();
myCustomWhitelist.addTags("b", "em", ...);

请在此处查看详细信息:Jsoup Whitelists

Jsoup 1.8.3

答案 1 :(得分:1)

经过多次搜索谷歌并经过一些尝试自己实施html脱衣舞后,我的解决方案是使用HTMLStripCharFilter class of Solr escapedTags 替换为带有标准html标签的 blackList

  1. HTMLStripCharFilter比JSOUP库和大尺寸文件的正则表达式快
  2. 对于大尺寸文件,HTMLStripCharFilter没有像JSOUP(内存不足异常)这样的内存问题
  3. HTMLStripCharFilter并未进入灾难性回溯&#34;像正则表达式

答案 2 :(得分:0)

我看到两个解决方案:

  1. 增加Java堆空间。似乎将html生成为字符串需要的内存比允许的多。可以使用JVM的-Xmx命令行参数来增加最大JAVA堆:

    java -Xmx512m parsing.java

  2. 您可以从基于DOM的JSoup切换到基于SAX的解析器,如nekohtml这样的解析器可以处理任何大小的html文档,因为它们永远不会在内存中构建完整的DOM。

答案 3 :(得分:0)

对我而言,足以使用Jsoup方法的组合:

Jsoup.clean(Jsoup.parse(htmlString).text(), Whitelist.simpleText()) 

您可以选择的白名单...