如何使用 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("<", "<").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();
}
有办法解决吗?
我看到两个解决方案:
增加 Java 堆 space。似乎将 html 生成为字符串需要比您允许的更多的内存。可以使用 JVM 的 -Xmx
命令行参数来增加最大 JAVA 堆:
java-Xmx512mparsing.java
您可以从基于 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 标签。白名单中未引用的任何标签都将被删除。
您可能对其他提供的白名单感兴趣:
- Whitelist.basic()
- Whitelist.basicWithImages()
- Whitelist.none()
- Whitelist.relaxed()
- Whitelist.simpleText()
可以通过添加标签来自定义这些基本白名单(参见 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 标签的黑名单 。
- 对于大型文件,HTMLStripCharFilter 比 JSOUP 库和正则表达式更快
- HTMLStripCharFilter 对于大文件没有像 JSOUP(内存不足异常)这样的内存问题
- HTMLStripCharFilter 没有像正则表达式那样进入 "catastrophic backtracking"
对我来说,使用 Jsoup 方法的组合就足够了:
Jsoup.clean(Jsoup.parse(htmlString).text(), Whitelist.simpleText())
您可以选择白名单...
Jsoup 1.14.2,只需使用:
doc.select(cssQuery).text();
去除所有标签和returns 一个漂亮的文本内容。在我的例子中,我有一个 ul,li 对,它很好地剥离了它们。
我只想从带有 JSOUP 的文本中删除 html 标签。我使用了这里的解决方案 (
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();
}
有办法解决吗?
我看到两个解决方案:
增加 Java 堆 space。似乎将 html 生成为字符串需要比您允许的更多的内存。可以使用 JVM 的
-Xmx
命令行参数来增加最大 JAVA 堆:java-Xmx512mparsing.java
您可以从基于 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 标签。白名单中未引用的任何标签都将被删除。
您可能对其他提供的白名单感兴趣:
- Whitelist.basic()
- Whitelist.basicWithImages()
- Whitelist.none()
- Whitelist.relaxed()
- Whitelist.simpleText()
可以通过添加标签来自定义这些基本白名单(参见 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 标签的黑名单 。
- 对于大型文件,HTMLStripCharFilter 比 JSOUP 库和正则表达式更快
- HTMLStripCharFilter 对于大文件没有像 JSOUP(内存不足异常)这样的内存问题
- HTMLStripCharFilter 没有像正则表达式那样进入 "catastrophic backtracking"
对我来说,使用 Jsoup 方法的组合就足够了:
Jsoup.clean(Jsoup.parse(htmlString).text(), Whitelist.simpleText())
您可以选择白名单...
Jsoup 1.14.2,只需使用:
doc.select(cssQuery).text();
去除所有标签和returns 一个漂亮的文本内容。在我的例子中,我有一个 ul,li 对,它很好地剥离了它们。