如何提取并存储在<strong>和<br/>之间的文本中的<strong>和<br/>之间的文本,其中<p>标记中没有html代码(例如etc)

时间:2019-04-29 06:52:23

标签: java jsoup

从段落标记中的强标记和<br>标记中提取文本作为单独的字符串。 我尝试使用<br>正则表达式拆分文本,但是文本包含HTML代码,例如pstrongnbsp

示例代码:

Document doc = Jsoup.parse(HTML);
Elements Paragraphs = doc.getElementsByTag("p");
String options = Paragraphs.first().html();
String[] singleOption = options.split("<br>");

我想从强标记和<br>标记中提取文本,并将每个标记存储在数组的索引中。

1 个答案:

答案 0 :(得分:0)

您可以将您的分割正则表达式扩展到<br>|</?strong>,这会在<br><strong>标签处分割一个字符串。要删除其他标签,您可以使用Jsoup.clean(string, Whitelist.none())。要对Unicode字符进行转义,请使用Parser.unescapeEntities(string, false)

使用Java Streams结合所有解决方案,解决方案如下:

Document doc = Jsoup.parse(html);
String[] parts = doc.select("p").stream()
        .flatMap(e -> Stream.of(e.html().split("<br>|</?strong>")))
        .map(s -> Jsoup.clean(s, Whitelist.none()))
        .map(s -> Parser.unescapeEntities(s, false))
        .map(String::trim)
        .filter(s -> !s.isEmpty())
        .toArray(String[]::new);

这会搜索所有段落以解析它们。

对于示例输入:

<p>foo b<i>a</i>r <strong>test</strong><br>abc&nbsp;xyz</p>
<p>hi <strong>this&nbsp;is<br>a<br>test</strong></p>

结果将是:

[foo bar, test, abc xyz, hi, this is, a, test]