我正在评估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
对此听起来有些过头了 - 是否可以完全关闭漂亮的打印(例如插入新行等)
或者我应该使用另一个框架?到目前为止,我已经浏览了htmlclean,但给出的示例并不表明我想要的功能得到了支持。
答案1
如何使用Jsoup加载/解析Document
?如果您使用parse()
或connect().get()
,jsoup将自动格式化您的html(插入html
、body
和head
标签)。这确保您始终拥有一个完整的Html文档,即使输入不完整。
假设您只想清理输入(不需要进一步处理),则应该使用clean()
,而不是前面列出的方法。
示例1-使用parse()
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已清理,不再清理。
文档:
- J汤
答案2
方法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>
文档:
- Node.replaceWith(中的节点)
- 文本节点
答案3
是的,Jsoup.OutputSettings
的prettyPrint()
方法可以做到这一点。
示例:
final String html = "<p>your html here</p>";
Document doc = Jsoup.parse(html);
doc.outputSettings().prettyPrint(false);
System.out.println(doc);
注意:如果outputSettings()
方法不可用,请更新Jsoup。
输出:
<html><head></head><body><p>your html here</p></body></html>
文档:
- Document.OutputSettings.prettyPrint(布尔漂亮)
答案4(无子弹)
不Jsoup是最好的和最有能力的Html库之一!