web-dev-qa-db-ja.com

jsoup-すべてのフォーマットタグとリンクタグを取り除き、テキストのみを保持

このようなhtmlフラグメントがあるとしましょう:

<p> <span> foo </span> <em> bar <a> foobar </a> baz </em> </p>

それから抽出したいものは:

foo bar foobar baz

だから私の質問は次のとおりです:どのようにhtmlからすべてのラッピングタグを取り除き、html内と同じ順序でテキストのみを取得できますか?タイトルでわかるように、解析にjsoupを使用します。

アクセント付きHTMLの例(「á」文字に注意してください):

<p><strong>Tarthatatlan biztonsági viszonyok</strong></p>
<p><strong>Tarthatatlan biztonsági viszonyok</strong></p>

私が欲しいもの:

Tarthatatlan biztonsági viszonyok
Tarthatatlan biztonsági viszonyok

このhtmlは静的ではありません。一般的には、デコードされた人間が読み取れる形式、幅の改行で一般的なhtmlフラグメントのすべてのテキストが必要です。

38
WonderCsabo

Jsoupで:

_final String html = "<p> <span> foo </span> <em> bar <a> foobar </a> baz </em> </p>";
Document doc = Jsoup.parse(html);

System.out.println(doc.text());
_

出力:

_foo bar foobar baz
_

Pタグのテキストのみが必要な場合は、doc.text()の代わりにこれを使用します。

_doc.select("p").text();
_

...または本体のみ:

_doc.body().text();
_

改行:

_final String html = "<p><strong>Tarthatatlan biztonsági viszonyok</strong></p>"
        + "<p><strong>Tarthatatlan biztonsági viszonyok</strong></p>";
Document doc = Jsoup.parse(html);

for( Element element : doc.select("p") )
{
    System.out.println(element.text());
    // eg. you can use a StringBuilder and append lines here ...
}
_

出力:

_Tarthatatlan biztonsági viszonyok  
Tarthatatlan biztonsági viszonyok
_
52
ollo

正規表現を使用:-

String str = "<p> <span> foo </span> <em> bar <a> foobar </a> baz </em> </p>";
str = str.replaceAll("<[^>]*>", "");
System.out.println(str);

[〜#〜] output [〜#〜]:-

  foo   bar  foobar  baz 

Jsoupを使用:-

Document doc = Jsoup.parse(str); 
String text = doc.text();
12
Rohit Jain

実際、Jsoupでクリーンアップする正しい方法は、 ホワイトリスト

...
final String html = "<p> <span> foo </span> <em> bar <a> foobar </a> baz </em> </p>";
Document doc = Jsoup.parse(html);
Whitelist wl = new Whitelist().none()
String cleanText = new Jsoup().clean(doc ,wl)

それでもいくつかのタグを保持したい場合:

Whitelist wl = new Whitelist().relaxed().removeTags("a")
4
Al-Punk