Jsoup.clean без добавления html-объектов
Я очищаю текст из нежелательных HTML-тегов (например, <script>
) с помощью
String clean = Jsoup.clean(someInput, Whitelist.basicWithImages());
Проблема заключается в том, что она заменяет, например, å
на å
(что вызывает проблемы для меня, поскольку это не "чистый xml" ).
Например
Jsoup.clean("hello å <script></script> world", Whitelist.basicWithImages())
дает
"hello å world"
но я хотел бы
"hello å world"
Есть ли простой способ достичь этого? (Т.е. проще, чем преобразование å
назад в å
в результате.)
Ответы
Ответ 1
Вы можете настроить режим экранирования 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();
Ответ 2
На сайте Jsoup уже есть запросы функций. Вы можете расширить исходный код самостоятельно, добавив новую пустую карту и новый тип экранирования. Если вы не хотите этого делать, вы можете использовать StringEscapeUtils из сообщества apache.
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;
}
Ответ 3
Более простой способ сделать это -
// 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());
Я тестировал это, и он работает
Ответ 4
В принятом ответе используется 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();
}
Ответ 5
Ответ от & bmoc работает нормально, но вы можете использовать более короткое решение:
// Clean html
Jsoup.clean(someInput, "yourBaseUriOrEmpty", Whitelist.simpleText(), new OutputSettings().escapeMode(EscapeMode.xhtml))
Ответ 6
Разбирайте HTML как документ, затем используйте Cleaner для очистки документа и создания другого, получите выходные данные документа и установите соответствующую кодировку и режим эвакуации в xhtml, а затем преобразуйте документ в String. Не проверен, но должен работать.
Ответ 7
Простой способ:
EscapeMode em = EscapeMode.xhtml;
em.getMap().clear();
doc.outputSettings().escapeMode(em);
Это приведет к удалению ВСЕ html-сущностей, включая эти: ",", < и > . EscapeMode.xhtml позволяет этим объектам.