使用 jsoup 转义不允许的标签

发布于 2025-01-07 04:26:11 字数 965 浏览 1 评论 0原文

我正在评估 jsoup 的功能,该功能可以清理(但不会删除!)非白名单标签。假设只允许使用 标签,因此以下输入

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()始终假定 。是的,我可以调用 document.body().getAllElements() 但重点是我不知道我的源代码是完整的 HTML 文档还是只是正文 - 我想要结果与它进来时的形状和形式相同;
  • 如何用 替换 >?我只想用转义实体替换括号,不想更改任何属性等。 Node.replaceWith 听起来有点矫枉过正。
  • 是否可以完全关闭漂亮的打印(例如插入新行等)?

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

I am evaluating jsoup for the functionality which would sanitize (but not remove!) the non-whitelisted tags. Let's say only <b> tag is allowed, so the following input

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

has to yield the following:

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

I see the following problems/questions with jsoup:

  • document.getAllElements() always assumes <html>, <head> and <body>. Yes, I can call document.body().getAllElements() but the point is that I don't know if my source is a full HTML document or just the body -- and I want the result in the same shape and form as it came in;
  • how do I replace <script>...</script> with <script>...</script>? I only want to replace brackets with escaped entities and do not want to alter any attributes, etc. Node.replaceWith sounds like an overkill for this.
  • Is it possible to completely switch off pretty printing (e.g. insertion of new lines, etc.)?

Or maybe I should use another framework? I have peeked at htmlcleaner so far, but the given examples don't suggest my desired functionality is supported.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

生活了然无味 2025-01-14 04:26:11

回答 1

如何使用 Jsoup 加载/解析您的 Document?如果您使用 parse()connect().get() jsoup 将自动格式化您的 html (插入 html, body< /code> 和 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 已清理,而不是更多。

文档:


答案 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>

文档:


回答 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>

文档:


答案 4 (无项目符号)

不! Jsoup 是最好和最功能最强 Html 库之一!

Answer 1

How do you load / parse your Document with Jsoup? If you use parse() or connect().get() jsoup will automaticly format your html (inserting html, body and head tags). This this ensures you always have a complete Html document - even if input isnt complete.

Let's assume you only want to clean an input (no furhter processing) you should use clean() instead the previous listed methods.

Example 1 - Using parse()

final String html = "<b>a</b>";

System.out.println(Jsoup.parse(html));

Output:

<html>
 <head></head>
 <body>
  <b>a</b>
 </body>
</html>

Input html is completed to ensure you have a complete document.

Example 2 - Using clean()

final String html = "<b>a</b>";

System.out.println(Jsoup.clean("<b>a</b>", Whitelist.relaxed()));

Output:

<b>a</b>

Input html is cleaned, not more.

Documentation:


Answer 2

The method replaceWith() does exactly what you need:

Example:

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);

Output:

<html>
 <head></head>
 <body>
  <b><script>your script here</script></b>
 </body>
</html>

Or body only:

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

Output:

<b><script>your script here</script></b>

Documentation:


Answer 3

Yes, prettyPrint() method of Jsoup.OutputSettings does this.

Example:

final String html = "<p>your html here</p>";

Document doc = Jsoup.parse(html);
doc.outputSettings().prettyPrint(false);

System.out.println(doc);

Note: if the outputSettings() method is not available, please update Jsoup.

Output:

<html><head></head><body><p>your html here</p></body></html>

Documentation:


Answer 4 (no bullet)

No! Jsoup is one of the best and most capable Html library out there!

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文