Jsoup.clean без добавления html-сущностей - PullRequest
25 голосов
/ 30 декабря 2011

Я очищаю текст от нежелательных тегов HTML (например, <script>) с помощью

String clean = Jsoup.clean(someInput, Whitelist.basicWithImages());

Проблема в том, что он заменяет, например, å на &aring; (что вызывает у меня проблемы, поскольку это не "чистый xml").

Например

Jsoup.clean("hello å <script></script> world", Whitelist.basicWithImages())

1012 * выходы *

"hello &aring;  world"

но я бы хотел

"hello å  world"

Есть ли простой способ добиться этого? (То есть проще, чем преобразовать &aring; обратно в å в результате.)

Ответы [ 7 ]

34 голосов
/ 11 мая 2012

Вы можете настроить режим выхода Jsoup: Использование EscapeMode.xhtml даст вам вывод без сущностей.

Вот полный фрагмент, который принимает str в качестве ввода и очищает его с помощью Whitelist.simpleText():

// Parse str into a Document
Document doc = Jsoup.parse(str);

// Clean the document.
doc = new Cleaner(Whitelist.simpleText()).clean(doc);

// Adjust escape mode
doc.outputSettings().escapeMode(EscapeMode.xhtml);

// Get back the string of the body.
str = doc.body().html();
10 голосов
/ 16 февраля 2012

На сайте Jsoup уже есть запросы на добавление функций. Вы можете расширить исходный код самостоятельно, добавив новую пустую карту и новый тип экранирования. Если вы не хотите этого делать, вы можете использовать StringEscapeUtils из Apache Commons.

public static String getTextOnlyFromHtmlText(String htmlText){
    Document doc = Jsoup.parse( htmlText );
    doc.outputSettings().charset("UTF-8");
    htmlText = Jsoup.clean( doc.body().html(), Whitelist.simpleText() );
    htmlText = StringEscapeUtils.unescapeHtml(htmlText);
    return htmlText;
}
4 голосов
/ 24 марта 2017

Ответ от & bmoc работает нормально, но вы можете использовать более короткое решение:

// Clean html
Jsoup.clean(someInput, "yourBaseUriOrEmpty", Whitelist.simpleText(), new OutputSettings().escapeMode(EscapeMode.xhtml))
2 голосов
/ 03 февраля 2014

В принятом ответе используется Jsoup.parse, который кажется более тяжелым, чем то, что происходит в Jsoup.clean после быстрого взгляда на источник.

Я скопировал исходный код Jsoup.clean(...) и добавиллиния для установки режима выхода.Это должно избежать некоторых ненужных шагов, выполняемых методом parse, потому что он не должен анализировать весь HTML-документ, а просто обрабатывает фрагмент.

private String clean(String html, Whitelist whitelist) {
    Document dirty = Jsoup.parseBodyFragment(html, "");
    Cleaner cleaner = new Cleaner(whitelist);
    Document clean = cleaner.clean(dirty);
    clean.outputSettings().escapeMode(EscapeMode.xhtml);
    return clean.body().html();
}
2 голосов
/ 06 января 2013

Более простой способ сделать это -

// clean the html
String output = Jsoup.clean(html, Whitelist.basicWithImages());

// Parse string into a document
Document doc = Jsoup.parse(output);

// Adjust escape mode
doc.outputSettings().escapeMode(EscapeMode.xhtml);

// Get back the string
System.out.println(doc.body().html());

Я проверил это, и оно работает

0 голосов
/ 27 июня 2015

Простой способ:

EscapeMode em = EscapeMode.xhtml;
em.getMap().clear();

doc.outputSettings().escapeMode(em);

Это удалит ВСЕХ html-сущностей, включая следующие: & apos ;, ", &, <и> . EscapeMode.xhtml разрешает эти сущности.

0 голосов
/ 30 декабря 2011

Разобрать HTML как документ, затем с помощью очистителя очистить документ и сгенерировать другой, получить outputSettings документа и установить для соответствующего набора символов и режима escape значение xhtml, а затем преобразовать документ в строку. Не проверено, но должно работать.

...