删除HTML实体,同时使用JSoup保留换行符

时间:2011-03-18 05:28:55

标签: java html parsing jsoup

我一直在使用JSoup来解析歌词,直到现在它还很棒,但遇到了问题。

我可以使用Node.html()返回所需节点的完整HTML,该节点会保留换行符:

Glóandi augu, silfurnátt
<br />Bl&oacute;&eth; alv&ouml;ru, starir &aacute;
<br />&Oacute;&eth;ur hundur er &iacute; v&iacute;gam&oacute;&eth;, &iacute; maga... m&eacute;r
<br />
<br />Kolni&eth;ur gref, kvik sem dreg h&eacute;r
<br />Kolni&eth;ur svart, hvergi bjart n&eacute;

但是,正如您所看到的那样,保留HTML实体和标签会产生令人遗憾的副作用。

但是,如果我使用Node.text(),我可以获得更好看的结果,没有标签和实体:

Glóandi augu, silfurnátt Blóð alvöru, starir á Óður hundur er í vígamóð, í maga... mér Kolniður gref, kvik sem dreg hér Kolniður svart,

这有另一个令人遗憾的副作用,即删除换行符并压缩成一行。

在调用<br />之前简单地从节点替换Node.text()会产生相同的结果,并且似乎该方法将文本压缩到方法本身的单行上,忽略换行符。

是否可以充分利用这两个世界,并且正确地替换标签和实体以保留换行符,或者是否有其他方法或方法来解码实体并删除标签而无需手动替换它们?

2 个答案:

答案 0 :(得分:2)

(免责声明)我没有使用过这个API ...  但是快速查看文档表明您可以访问每个后代节点并转储其文本内容。遇到<br>之类的特殊标签时,可以插入中断。

TextNode.getWholeText()电话看起来也很有用。

答案 1 :(得分:1)

基于stackoverflow的另一个答案,我添加了一些修补程序并附带

    String text = Jsoup.parse(html.replaceAll("(?i)<br[^>]*>", "br2nl").replaceAll("\n", "br2nl")).text();
    text = text.replaceAll("br2nl ", "\n").replaceAll("br2nl", "\n").trim();

希望这有帮助