web-dev-qa-db-ja.com

HTMLエンティティを追加しないJsoup.clean

を使用して、不要なHTMLタグ(<script>など)から一部のテキストを削除します

String clean = Jsoup.clean(someInput, Whitelist.basicWithImages());

問題は、たとえばå&aring;に置き換えることです(「純粋なxml」ではないため、問題が発生します)。

例えば

Jsoup.clean("hello å <script></script> world", Whitelist.basicWithImages())

収量

"hello &aring;  world"

でも欲しい

"hello å  world"

これを達成する簡単な方法はありますか? (つまり、結果で&aring;åに変換するよりも簡単です。)

26
aioobe

Jsoupのエスケープモードを構成できます。_EscapeMode.xhtml_を使用すると、エンティティなしの出力が得られます。

以下は、strを入力として受け入れ、Whitelist.simpleText()を使用してクリーンアップする完全なスニペットです。

_// Parse str into a Document
Document doc = Jsoup.parse(str);

// Clean the document.
doc = new Cleaner(Whitelist.simpleText()).clean(doc);

// Adjust escape mode
doc.outputSettings().escapeMode(EscapeMode.xhtml);

// Get back the string of the body.
str = doc.body().html();
_
34
bmoc

Jsoupのウェブサイトにはすでに機能リクエストがあります。新しい空のマップと新しいエスケープタイプを追加することにより、ソースコードを自分で拡張できます。これを実行したくない場合は、ApacheコモンズのStringEscapeUtilsを使用できます。

public static String getTextOnlyFromHtmlText(String htmlText){
    Document doc = Jsoup.parse( htmlText );
    doc.outputSettings().charset("UTF-8");
    htmlText = Jsoup.clean( doc.body().html(), Whitelist.simpleText() );
    htmlText = StringEscapeUtils.unescapeHtml(htmlText);
    return htmlText;
}
10
Frank Szilinski

&bmocからの回答は問題なく機能していますが、より短い解決策を使用することもできます。

// Clean html
Jsoup.clean(someInput, "yourBaseUriOrEmpty", Whitelist.simpleText(), new OutputSettings().escapeMode(EscapeMode.xhtml))
4
ersefuril

受け入れられた答えは_Jsoup.parse_を使用しています。これは、ソースを一目見ただけで_Jsoup.clean_で行われていることよりも重いようです。

Jsoup.clean(...)のソースコードをコピーしてエスケープモードを設定する行を追加しました。これは、htmlドキュメント全体を解析する必要はなく、フラグメントを処理するだけなので、parseメソッドによって実行される不要な手順を回避する必要があります。

_private String clean(String html, Whitelist whitelist) {
    Document dirty = Jsoup.parseBodyFragment(html, "");
    Cleaner cleaner = new Cleaner(whitelist);
    Document clean = cleaner.clean(dirty);
    clean.outputSettings().escapeMode(EscapeMode.xhtml);
    return clean.body().html();
}
_
2
kapex

これを行う簡単な方法は

// clean the html
String output = Jsoup.clean(html, Whitelist.basicWithImages());

// Parse string into a document
Document doc = Jsoup.parse(output);

// Adjust escape mode
doc.outputSettings().escapeMode(EscapeMode.xhtml);

// Get back the string
System.out.println(doc.body().html());

私はこれをテストしましたが、うまくいきます

2
Girish

簡単な方法:

EscapeMode em = EscapeMode.xhtml;
em.getMap().clear();

doc.outputSettings().escapeMode(em);

[〜#〜] all [〜#〜] htmlエンティティ( '、 "、&、<、>を含む)が削除されます。 EscapeMode.xhtmlはこれらのエンティティを許可します。

0
Diego Queres

HTMLをドキュメントとして解析し、クリーナーを使用してドキュメントをクリーンアップして別のドキュメントを生成し、ドキュメントのoutputSettingsを取得し、適切な文字セットとエスケープモードをxhtmlに設定して、ドキュメントを文字列に変換します。テストされていませんが、動作するはずです。

0
JB Nizet