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

2022-08-31 20:55:14

假设我有一个这样的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片段的每个文本,以解码的人类可读形式,宽度换行符。


答案 1

使用 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-tag 的文本,请使用此文本而不是 :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

答案 2

使用正则表达式: -

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

输出: -

  foo   bar  foobar  baz 

使用 Jsoup: -

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