Странное поведение при кодировании с помощью jsoup - PullRequest
3 голосов
/ 10 октября 2011

Я извлекаю некоторую информацию из исходного кода html разных страниц с помощью jsoup.Большинство из них имеют кодировку UTF-8.Один из них кодируется с помощью ISO-8859-1, что приводит к странной ошибке (по моему мнению).

Страница, содержащая ошибку: http://www.gudi.ch/armbanduhr-metall-wasserdicht-1280x960-megapixels-p-560.html

Я прочиталНеобходимая строка со следующим фрагментом кода:

Document doc = Jsoup.connect("http://www.gudi.ch/armbanduhr-metall-wasserdicht-1280x960-megapixels-p-560.html").userAgent("Mozilla").get();
String title = doc.getElementsByClass("products_name").first().text();

Проблема заключается в дефисе в строке «HD Armbanduhr aus Metall 4GB Wasserdicht 1280X960 - 5 мегапикселей».Нормальные умлауты типа öäü читаются правильно.Только этот единственный символ, который не считается "& # 45;"делает проблему.

Я попытался переопределить (правильно установленную) кодировку страницы с помощью out.outputSettings (). charset ("ISO-8859-1"), но это тоже не помогло.

Далее я попытался изменить кодировку строки с помощью класса Charset с и на utf8 и iso-8859-1 вручную.Также не повезло.

Кто-нибудь подсказал, что я могу попытаться получить правильный символ после анализа html-документа с помощью jsoup?

Спасибо

1 Ответ

7 голосов
/ 10 октября 2011

Это ошибка самого сайта. На самом деле это три ошибки:

  1. Страница обслуживается без любой кодировки в заголовке ответа HTTP Content-Type. В метатеге HTML есть ISO-8859-1, но это игнорируется, когда страница обслуживается по HTTP! Среднестатистический веб-браузер будет либо пытаться использовать интеллектуальное обнаружение, либо использовать кодировку платформы по умолчанию для кодирования веб-страницы, которая на компьютерах с Windows называется CP1252.

  2. Тег <meta> делает вид, что содержимое имеет кодировку ISO-8859-1, но фактический символ ( U + 2013 EN DASH ) равен , а не покрыто этой кодировкой вообще. Однако он покрыт кодировкой CP1252 как 0x0096.

  3. В соответствии с исходным кодом веб-страницы в названии продукта используется буквенный символ вместо HTML-элемента &ndash;, как указано в другом месте на той же веб-странице.

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

String url = "http://www.gudi.ch/armbanduhr-metall-wasserdicht-1280x960-megapixels-p-560.html";
InputStream input = new URL(url).openStream();
Document doc = Jsoup.parse(input, "CP1252", url);
String title = doc.select(".products_name").first().text();
// ...
...