Удаление объектов HTML при сохранении разрывов строк с помощью 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() дает тот же результат, и кажется, что этот метод сжимает текст в одну строку в самом методе, игнорируя новые строки.

Возможно ли получить лучшее из обоих миров и правильно заменить теги и объекты, сохранив разрывы строк, или есть другой метод или способ декодирования объектов и удаления тегов без необходимости их замены вручную?


person joshschreuder    schedule 18.03.2011    source источник


Ответы (2)


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

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

person qwerty    schedule 18.03.2011
comment
Используется TextNode.createFromEncoded(lyrics, aURI); для создания TextNode из HTML, затем getWholeText() для получения самого текста. Он оставляет ‹br /› нетронутым, но полностью заменяет сущности, и я могу просто заменить минимальные HTML-теги вручную, так что спасибо :) - person joshschreuder; 18.03.2011
comment
Следует упомянуть, что я читал API, но явно пропустил указанную вами функцию. - person joshschreuder; 18.03.2011

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

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

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

person petrumo    schedule 13.03.2012