问题描述

假设我有一个这样的 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 片段的每个文本。

最佳解决方法

与 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

次佳解决方法

使用正则表达式: –

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

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。