У меня такой код:
public class NewClass {
public String noTags(String str){
return Jsoup.parse(str).text();
}
public static void main(String args[]) {
String strings="<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN \">" +
"<HTML> <HEAD> <TITLE></TITLE> <style>body{ font-size: 12px;font-family: verdana, arial, helvetica, sans-serif;}</style> </HEAD> <BODY><p><b>hello world</b></p><p><br><b>yo</b> <a href=\"http://google.com\">googlez</a></p></BODY> </HTML> ";
NewClass text = new NewClass();
System.out.println((text.noTags(strings)));
}
И вот результат:
hello world yo googlez
Но я хочу прервать черту:
hello world
yo googlez
Я просмотрел TextNode # getWholeText () jsoup, но не могу понять, как его использовать.
Если <br>
в разметке, которую я анализирую, есть символ, как я могу получить разрыв строки в моем конечном результате?
Ответы:
Настоящее решение, сохраняющее разрывы строк, должно быть таким:
Он удовлетворяет следующим требованиям:
источник
for (Element e : document.select("br")) e.after(new TextNode("\n", ""));
добавления настоящей новой строки, а не последовательности \ n? См. Различия в Node :: after () и Elements :: append () . ВreplaceAll()
этом случае не требуется. Аналогично p и другим блочным элементам.Мы используем этот метод здесь:
Передавая его,
Whitelist.none()
мы убеждаемся, что весь HTML удален.Пройдя,
new OutputSettings().prettyPrint(false)
мы убеждаемся, что вывод не переформатируется, а разрывы строк сохраняются.источник
br
теги создают новые строки. А как насчет любого другого блочного элемента в HTML, напримерdiv
,p
иul
т. Д.? Все они тоже вводят новые строки.С участием
у вас есть выход
и нет
Для этого я использую:
источник
<br>
элементы текстовыми узлами, содержащими новые строки, а затем вызвать.text()
вместо преобразования регулярное выражение, которое приведет к неправильному выводу для некоторых строк, таких как<div title=<br>'not an attribute'></div>
Попробуйте это с помощью jsoup:
источник
new Document.OutputSettings().prettyPrint(true)
В Jsoup v1.11.2 теперь мы можем использовать
Element.wholeText()
.Пример кода:
user121196's
ответ по- прежнему работает. НоwholeText()
сохраняет выравнивание текстов.источник
Для более сложного HTML ни одно из вышеперечисленных решений не сработало должным образом; Мне удалось успешно выполнить преобразование, сохранив разрывы строк:
(версия 1.10.3)
источник
Вы можете перемещаться по заданному элементу
И для вашего кода
источник
isBlock
вtail(node, depth)
вместо этого, и Append\n
при выходе из блока , а не при входе его? Я делаю это (то есть используюtail
), и это прекрасно работает. Однако, если я использую,head
как вы, то это:<p>line one<p>line two
заканчивается как одна строка.работает, если сам html не содержит "br2n"
Так,
работает надежнее и проще.
источник
Попробуйте это с помощью jsoup:
источник
Используйте
textNodes()
для получения списка текстовых узлов. Затем объедините их\n
как разделитель. Вот некоторый код Scala, который я использую для этого, порт java должен быть простым:источник
Основываясь на других ответах и комментариях по этому вопросу, кажется, что большинство людей, приходящих сюда, действительно ищут общее решение, которое обеспечит красиво отформатированное текстовое представление HTML-документа. Я знаю, что был.
К счастью, JSoup уже предоставляет довольно исчерпывающий пример того, как этого добиться: HtmlToPlainText.java
Пример
FormattingVisitor
можно легко настроить в соответствии с вашими предпочтениями, и он касается большинства блочных элементов и переноса строк.Чтобы избежать гниения ссылок, вот полное решение Джонатана Хедли :
источник
Это моя версия перевода html в текст (на самом деле модифицированная версия ответа user121196).
Это не только сохраняет разрывы строк, но также форматирует текст и удаляет лишние разрывы строк, escape-символы HTML, и вы получите гораздо лучший результат от своего HTML (в моем случае я получаю его по почте).
Первоначально он написан на Scala, но вы можете легко изменить его на Java.
источник
Попробуй это:
источник
Используется путем вызова с рассматриваемым html, содержащим br, вместе с любой строкой, которую вы хотите использовать в качестве временного заполнителя новой строки. Например:
Рекурсия гарантирует, что строка, которую вы используете в качестве заполнителя новой строки / разрыва строки, никогда не будет на самом деле в исходном html, так как она будет продолжать добавлять «1» до тех пор, пока строка-заполнитель прерывателя ссылок не будет найдена в HTML. У него не будет проблем с форматированием, с которыми, похоже, сталкиваются методы Jsoup.clean со специальными символами.
источник
Основываясь на ответе user121196 и Green Beret с
select
s и<pre>
s, единственное решение, которое работает для меня:источник