使用jsoup对不允许的标记进行转义



我正在评估jsoup的功能,该功能可以清除(但不能删除!)非白名单标签。假设只允许使用<b>标签,那么下面的输入

foo <b>bar</b> <script onLoad='stealYourCookies();'>baz</script>

必须产生以下结果:

foo <b>bar</b> &lt;script onLoad='stealYourCookies();'&gt;baz&lt;/script&gt;

我发现jsoup存在以下问题:

  • document.getAllElements()总是假定<html><head><body>。是的,我可以调用document.body().getAllElements(),但关键是我不知道我的源是一个完整的HTML文档还是只是正文——我希望结果的形状和形式与它出现时相同
  • 如何用&lt;script&gt;...&lt;/script&gt;替换<script>...</script>?我只想用转义实体替换方括号,不想更改任何属性等。Node.replaceWith对此听起来有些过头了
  • 是否可以完全关闭漂亮的打印(例如插入新行等)

或者我应该使用另一个框架?到目前为止,我已经浏览了htmlclean,但给出的示例并不表明我想要的功能得到了支持。

答案1

如何使用Jsoup加载/解析Document?如果您使用parse()connect().get(),jsoup将自动格式化您的html(插入htmlbodyhead标签)。这确保您始终拥有一个完整的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>&lt;script&gt;your script here&lt;/script&gt;</b>
 </body>
</html>

仅限正文

System.out.println(doc.body().html());

输出:

<b>&lt;script&gt;your script here&lt;/script&gt;</b>

文档:

  • Node.replaceWith(中的节点)
  • 文本节点

答案3

是的,Jsoup.OutputSettingsprettyPrint()方法可以做到这一点。

示例:

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库之一!

相关内容

  • 没有找到相关文章

最新更新