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

How to remove only html tags from text with Jsoup?

我只想从带有 JSOUP 的文本中删除 html 标签。我使用了这里的解决方案 () 但经过一些检查后,我发现 JSOUP 得到 JAVA 堆异常:大 html 的 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();
}

有办法解决吗?

我看到两个解决方案:

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

    java-Xmx512mparsing.java

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

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

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

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

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

可以通过添加标签来自定义这些基本白名单(参见 addTags method) or by removing tags (see removeTags 方法)。

如果您想创建自己的白名单(小心!),方法如下:

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

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

Jsoup 1.8.3

在 google 中多次搜索并尝试自己实现 html 剥离器后,我的解决方案是使用 HTMLStripCharFilter class of Solr 替换 escapedTags 带有标准 html 标签的黑名单

  1. 对于大型文件,HTMLStripCharFilter 比 JSOUP 库和正则表达式更快
  2. HTMLStripCharFilter 对于大文件没有像 JSOUP(内存不足异常)这样的内存问题
  3. HTMLStripCharFilter 没有像正则表达式那样进入 "catastrophic backtracking"

对我来说,使用 Jsoup 方法的组合就足够了:

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

您可以选择白名单...

Jsoup 1.14.2,只需使用:

doc.select(cssQuery).text();

去除所有标签和returns 一个漂亮的文本内容。在我的例子中,我有一个 ul,li 对,它很好地剥离了它们。