Удаление HTML-сущностей с сохранением разрывов строк с помощью JSoup - PullRequest
3 голосов
/ 18 марта 2011

Я использовал 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 ]

2 голосов
/ 18 марта 2011

(отказ от ответственности) Я не использовал этот API ... но быстрый просмотр документов показывает, что вы можете посетить каждый дочерний узел и выгрузить его текстовое содержимое. Разрывы могут быть вставлены, когда встречаются специальные теги, такие как <br>.

Вызов TextNode.getWholeText () также выглядит полезным.

1 голос
/ 13 марта 2012

на основе другого ответа от stackoverflow Я добавил несколько исправлений и пришел с

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

Надеюсь, это поможет

...