jsoup - 删除所有格式和链接标记,仅保留文本

Won*_*abo 39 html java jsoup

假设我有一个像这样的html片段:

<p> <span> foo </span> <em> bar <a> foobar </a> baz </em> </p>
Run Code Online (Sandbox Code Playgroud)

我想从中提取的是:

foo bar foobar baz
Run Code Online (Sandbox Code Playgroud)

所以我的问题是:如何从html中删除所有包装标签,并获得与html中相同顺序的文本?正如您在标题中看到的,我想使用jsoup进行解析.

重音html的示例(注意'á'字符):

<p><strong>Tarthatatlan biztonsági viszonyok</strong></p>
<p><strong>Tarthatatlan biztonsági viszonyok</strong></p>
Run Code Online (Sandbox Code Playgroud)

我想要的是:

Tarthatatlan biztonsági viszonyok
Tarthatatlan biztonsági viszonyok
Run Code Online (Sandbox Code Playgroud)

这个html不是静态的,通常我只想要一个通用html片段的每个文本都以解码的人类可读形式,宽度换行符.

oll*_*llo 53

使用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());
Run Code Online (Sandbox Code Playgroud)

输出:

foo bar foobar baz
Run Code Online (Sandbox Code Playgroud)

如果您只想要p-tag的文本,请使用以下代码doc.text():

doc.select("p").text();
Run Code Online (Sandbox Code Playgroud)

......或只是身体:

doc.body().text();
Run Code Online (Sandbox Code Playgroud)

越线:

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 ...
}
Run Code Online (Sandbox Code Playgroud)

输出:

Tarthatatlan biztonsági viszonyok  
Tarthatatlan biztonsági viszonyok
Run Code Online (Sandbox Code Playgroud)


Roh*_*ain 12

使用正则表达式: -

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

输出: -

  foo   bar  foobar  baz 
Run Code Online (Sandbox Code Playgroud)

使用Jsoup: -

Document doc = Jsoup.parse(str); 
String text = doc.text();
Run Code Online (Sandbox Code Playgroud)

  • 不要使用正则表达式进行 HTML 解析:/sf/ask/121264391/ except-xhtml-self-contained-tags/1732454#1732454 (2认同)

Al-*_*unk 7

实际上,使用 Jsoup 进行清理的正确方法是通过白名单

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

如果您仍想保留一些标签:

Whitelist wl = new Whitelist().relaxed().removeTags("a")
Run Code Online (Sandbox Code Playgroud)

  • 小修复,无法初始化`Jsoup`类,需要使用`Jsoup.clean(html, wl)`(需要传递HTML字符串,而不是文档) (2认同)