如何使用Jsoup仅删除文本中的HTML标签?

4
我想使用JSOUP从文本中仅删除HTML标签。我使用了这里的解决方案 (我的之前关于JSOUP的问题),但经过一些检查,发现JSOUP会针对大型HTML文件(例如2MB,10000行)出现JAVA堆异常:OutOfMemoryError。代码在最后一行抛出异常(而不是在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();
}

有没有办法修复它?
5个回答

8

另外,您可以尝试使用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白名单 Jsoup 1.8.3

1

在谷歌上搜索了很多次并尝试自己实现 HTML 剥离器之后,我的解决方案是使用 Solr 的 HTMLStripCharFilter 类,将 转义标签 替换为 带有标准 HTML 标签的黑名单

  1. HTMLStripCharFilter 对于大文件的速度比 JSOUP 库和正则表达式更快。
  2. HTMLStripCharFilter 在处理大文件时不像 JSOUP 会出现内存问题 (内存溢出异常)。
  3. HTMLStripCharFilter 不会像正则表达式一样进入“灾难性回溯”。

我使用 jsoup:1.9.2 测试了一个 4.8MB 的 HTML 文件,并没有遇到任何问题。测试速度与 HelloWorld 基本测试相比,没有明显变慢。 - P.Brian.Mackey

0

我看到两个解决方案:

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

    java -Xmx512m parsing.java

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


  1. 对我没用。我尝试在Tomcat7w.exe中设置2048 Mb,但没有帮助。
  2. 我会检查的。
- Rougher
@Rougher 你在Tomcat中使用了CATALINA_OPTS变量吗?如果不知道为什么在此设置Tomcat时会有所不同,请参阅https://dev59.com/jnE85IYBdhLWcg3wikS-。 - luksch

0

Jsoup 1.14.2,只需使用:

doc.select(cssQuery).text();

去除所有标签并返回漂亮的文本内容。在我的情况下,我有一些ul、li对,它们都被很好地去除了。


0
对我来说,只需要使用Jsoup方法的组合就足够了:
Jsoup.clean(Jsoup.parse(htmlString).text(), Whitelist.simpleText()) 

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接