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

51

假设我有一个像这样的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
你尝试过fragment.text()吗? - Blender
1
第一次在问题中看到匈牙利文。 :) - SandorRacz
3个回答

68

使用 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();

...或仅限于body:

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

谢谢!现在我面临另一个问题:换行符。可以通过使用new TextNode(elem.html(),“”)。getWholeText()来解决,但它会将我的特殊重音字符变成HTML编码的字符。如何获取解码后的人类可读字符? - WonderCsabo
你能否发布一些HTML示例(包括你所拥有的HTML和你需要的结果),以及/或者代码。 - ollo
谢谢!这正是我也想到的,但我猜肯定有更聪明的方法。现在这样也不错。 - WonderCsabo

15

使用正则表达式:-

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();

2
不要使用正则表达式来解析HTML: https://dev59.com/X3I-5IYBdhLWcg3wq6do#1732454 - Ewoks

9

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

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

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

Safelist wl = new Safelist().relaxed().removeTags("a")

1
有没有不使用静态方法的理由,例如Jsoup.clean(html,WhiteList.none())? - Adam Law
2
小修复,你不能初始化Jsoup类,你需要使用Jsoup.clean(html, wl)(你需要传递HTML字符串,而不是文档)。 - MrPowerGamerBR

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接