我正在评估jsoup用于清理(但不删除!)非白名单标签的功能。假设只允许<b>
标记,所以输入
foo <b>bar</b> <script onLoad='stealYourCookies();'>baz</script>
必须提供以下内容:
foo <b>bar</b> <script onLoad='stealYourCookies();'>baz</script>
我在jsoup中看到以下问题/问题:
document.getAllElements()
始终采用<html>
,<head>
和<body>
。是的,我可以致电document.body().getAllElements()
,但重点是我不知道我的来源是完整的HTML文档还是仅仅是正文 - 我希望结果的形状和形式与它相同; <script>...</script>
替换为<script>...</script>
?我只想用转义的实体替换括号,并且不想改变任何属性等。Node.replaceWith
听起来像是一种矫枉过正。或许我应该使用另一个框架?到目前为止,我已经查看了htmlcleaner,但是给出的示例并未表明我支持所需的功能。
答案 0 :(得分:5)
如何使用Jsoup加载/解析Document
?如果您使用parse()
或connect().get()
,jsoup会自动格式化您的html(插入html
,body
和head
标记。这个确保你总是有一个完整的Html文档 - 即使输入不完整。
假设您只想清理输入(无需处理),您应该使用clean()
而不是之前列出的方法。
示例1 - 使用解析()
final String html = "<b>a</b>";
System.out.println(Jsoup.parse(html));
<强>输出:强>
<html>
<head></head>
<body>
<b>a</b>
</body>
</html>
输入html已完成,以确保您拥有完整的文档。
示例2 - 使用clean()
final String html = "<b>a</b>";
System.out.println(Jsoup.clean("<b>a</b>", Whitelist.relaxed()));
<强>输出:强>
<b>a</b>
输入html已清除,而不是更多。
<强>文档强>
方法replaceWith()
完全符合您的需要:
示例:强>
final String html = "<b><script>your script here</script></b>";
Document doc = Jsoup.parse(html);
for( Element element : doc.select("script") )
{
element.replaceWith(TextNode.createFromEncoded(element.toString(), null));
}
System.out.println(doc);
<强>输出:强>
<html>
<head></head>
<body>
<b><script>your script here</script></b>
</body>
</html>
或仅限身体:
System.out.println(doc.body().html());
<强>输出:强>
<b><script>your script here</script></b>
<强>文档强>
是的,prettyPrint()
的{{1}}方法可以做到这一点。
示例:强>
Jsoup.OutputSettings
注意:如果final String html = "<p>your html here</p>";
Document doc = Jsoup.parse(html);
doc.outputSettings().prettyPrint(false);
System.out.println(doc);
方法不可用,请更新Jsoup。
<强>输出:强>
outputSettings()
<强>文档强>
不! Jsoup是最佳和最强大的 Html库之一!