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>常に、、<head>およびを想定してい<body>ます。はい、電話することはできますdocument.body().getAllElements()が、要点は、ソースが完全なHTMLドキュメントなのか、本文だけなのかわからないということです。結果は、入ったときと同じ形と形にしたいと思っています。
  • どうすれば置き換え<script>...</script>られ&lt;script&gt;...&lt;/script&gt;ますか?角かっこをエスケープされたエンティティに置き換えたいだけで、属性などを変更したくないのですがNode.replaceWith、これはやり過ぎのように聞こえます。
  • きれいな印刷(新しい行の挿入など)を完全にオフにすることは可能ですか?

または、別のフレームワークを使用する必要がありますか?これまでhtmlcleanerを覗いてみましたが、与えられた例は、私の希望する機能がサポートされていることを示唆していません。

4

1 に答える 1

5

答え 1

DocumentJsoupを使用してどのようにロード/解析しますか? parse()またはjsoupを使用するconnect().get()と、html が自動的にフォーマットされます ( htmlbodyおよび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>&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 ライブラリの 1 つです。

于 2013-02-09T00:49:14.487 に答える