我只想使用 JSOUP 从文本中删除 html 标签。我使用了这里的解决方案(我之前关于 JSOUP 的问题) 但经过一番检查后,我发现 JSOUP 对于大型 html 会出现 JAVA 堆异常:OutOfMemoryError,但并非全部如此。例如,它在 html 2Mb 和 10000 行上失败。代码在最后一行抛出异常(不在 Jsoup.parse 上):
public String StripHtml(String html){
html = html.replace("<", "<").replace(">", ">");
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();
}
有办法解决吗?
或者,您可以尝试一下 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
在谷歌中进行了多次搜索并尝试自己实现html stripper之后,我的解决方案是使用Solr的HTMLStripCharFilter类,并将escapedTags替换为标准html标签blackList。
我看到两种解决方案:
增加Java堆空间。生成 html 作为字符串似乎需要比您允许的更多的内存。可以使用 JVM 的
-Xmx
命令行参数来增加最大 JAVA 堆:
java -Xmx512m 解析.java
您可以从基于 DOM 的 JSoup 切换到基于 SAX 的解析器,如 nekohtml 这样的解析器可以处理任何大小的 html 文档,因为它们永远不会在内存中构建完整的 DOM。
对我来说使用 Jsoup 方法的组合就足够了:
Jsoup.clean(Jsoup.parse(htmlString).text(), Whitelist.simpleText())
您可以选择白名单...
Jsoup 1.14.2,只需使用:
doc.select(cssQuery).text();
删除所有标签并返回漂亮的文本内容。就我而言,我有一对 ul、li,它很好地把它们全部剥离了。
对我来说,这有效。 systemClientSecret = Jsoup.clean(StringEscapeUtils.escapeHtml4(systemClientSecret), Safelist.none());
其中 systemClientSecret 是一个字符串。