2011-12-30 6 views
23

Я очищающий текст от нежелательного HTML тегов (такие как <script>) с помощьюJsoup.clean без добавления HTML сущности

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

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

Например

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

дает

"hello &aring; world" 

, но я хотел бы

"hello å world" 

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

ответ

32

Вы можете настроить режим вытекающего 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(); 
+3

Как-то это не сработало для объекта •. – mvmn

+0

Примечание. Вместо прямого взаимодействия с объектом [Cleaner] (https://jsoup.org/apidocs/org/jsoup/safety/Cleaner.html) используйте [clean methods] (https://jsoup.org/ apidocs/org/jsoup/Jsoup.html # clean-java.lang.String-java.lang.String-org.jsoup.safety.Whitelist-) в Jsoup. –

0

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

+0

Я попытался это, но Jsoup на данный момент всегда экранирование. –

10

На сайте 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; 
} 
+1

Хорошая точка с методом StringEscapeUtils Frank. Очень полезно, не только в этом случае – frandevel

+2

@frandevel Это была бы очень плохая идея. Если ввод «<script> alert (« Hello »); </script > ', вы на самом деле будете вводить небезопасный HTML-код и разрешать атаку XSS. –

+0

Эта функциональность теперь реализована i Jsoup. См. Parser.unescapeEntities, https://jsoup.org/apidocs/org/jsoup/parser/Parser.html –

2

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

// 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()); 

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

2

Принятый ответ использует 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(); 
} 
0

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

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

doc.outputSettings().escapeMode(em); 

Это удалит ВСЕ HTML сущностей, включая следующие: ', ", &, < и >. EscapeMode.xhtml позволяет этим объектам.

3

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

// Clean html 
Jsoup.clean(someInput, "yourBaseUriOrEmpty", Whitelist.simpleText(), new OutputSettings().escapeMode(EscapeMode.xhtml)) 
Смежные вопросы