2015-12-19 5 views
5

Я использую Jsoup для удаления всех изображений с HTML-страницы. Я получаю страницу через HTTP-ответ, который также содержит кодировку содержимого.Jsoup unescapes special characters

Проблема в том, что Jsoup не имеет специальных символов.

Например, для ввода:

<html><head></head><body><p>isn&rsquo;t</p></body></html> 

После запуска

String check = "<html><head></head><body><p>isn&rsquo;t</p></body></html>"; 
Document doc = Jsoup.parse(check); 
System.out.println(doc.outerHtml()); 

я получаю:

<html><head></head><body><p>isn’t</p></body></html><p></p> 

Я хочу, чтобы избежать изменения HTML любым другим способом, кроме для удаления изображений.

С помощью команды:

doc.outputSettings().prettyPrint(false).charset("ASCII").escapeMode(EscapeMode.extended); 

Я получаю правильный вывод, но я уверен, что есть случаи, когда что кодировка не будет хорошо. Я просто хочу использовать кодировку, указанную в заголовке HTTP, и я боюсь, что это изменит мой документ так, как я не могу предсказать. Есть ли какой-либо другой метод очистки изображений без каких-либо непреднамеренных изменений?

Спасибо!

ответ

3

Ниже приведено обходное решение, не связанное с какой-либо кодировкой, кроме указанной в заголовке HTTP.

String check = "<html><head></head><body><p>isn&rsquo;t</p></body></html>".replaceAll("&([^;]+?);", "**$1;"); 

Document doc = Jsoup.parse(check); 

doc.outputSettings().prettyPrint(false).escapeMode(EscapeMode.extended); 

System.out.println(doc.outerHtml().replaceAll("\\*\\*([^;]+?);", "&$1;")); 

ВЫВОД

<html><head></head><body><p>isn&rsquo;t</p></body></html> 

ОБСУЖДЕНИЕ

Я хотел было решение в API Jsoup в - @dlv

Использование Jsoup'API потребует от вас написания пользовательского NodeVisitor. Это приведет к (пере) созданию какого-либо существующего кода внутри Jsoup. Пользовательский Nodevisitor генерирует обратно код escape-кода HTML вместо символа юникода.

Другим вариантом является запись пользовательского кодировщика символов. Кодировщик символов UTF-8 по умолчанию может кодировать &rsquo;. Вот почему Jsoup не сохраняет исходную escape-последовательность в конечном HTML-коде.

Любой из двух указанных выше вариантов представляет собой большое усилие кодирования. В конечном итоге в Jsoup можно добавить расширение, позволяющее нам выбрать способ генерации символов в конечном HTML-коде: шестнадцатеричный escape (&#AB;), decimal escape (&#151;), исходная escape-последовательность (&rsquo;) или запись закодированного символа (который это ваш случай).

+0

Спасибо, я буду использовать это сейчас, хотя мне жаль, что в API Jsoup не было решения. – dlv

+0

@dlv См. Мое обновление. – Stephan

+0

Спасибо! Это действительно информативно. – dlv