1

我正在评估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>和。是的,我可以打电话,但关键是我不知道我的来源是完整的 HTML 文档还是只是正文——我希望结果与它的形状和形式相同;<head><body>document.body().getAllElements()
  • 我该如何<script>...</script>替换&lt;script&gt;...&lt;/script&gt;?我只想用转义实体替换括号,不想更改任何属性等。Node.replaceWith这听起来有点矫枉过正。
  • 是否可以完全关闭漂亮的打印(例如插入新行等)?

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

4

1 回答 1

5

答案 1

你如何Document用 Jsoup 加载/解析你的?如果你使用parse()or connect().get()jsoup 会自动格式化你的 html (插入html,bodyhead标签)。这可以确保您始终拥有完整的 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>&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>

文档:


答案 3

是的,这样做prettyPrint()的方法Jsoup.OutputSettings

例子:

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

于 2013-02-09T00:49:14.487 回答