3

我一直在使用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()产生相同的结果,并且该方法似乎将文本压缩到方法本身的单行上,而忽略了换行符。

是否有可能两全其美,并正确替换标签和实体以保留换行符,或者是否有另一种解码实体和删除标签而无需手动替换它们的方法或方式?

4

2 回答 2

2

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

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

于 2011-03-18T05:44:20.937 回答
1

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

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

希望这可以帮助

于 2012-03-13T15:54:49.907 回答