Парсер Node.js Cheerio ломает кодировку UTF-8

Я разбираю свой запрос с Cheerio следующим образом:

var url = http://shop.nag.ru/catalog/16939.IP-videonablyudenie-OMNY/16944.IP-kamery-OMNY-c-vario-obektivom/16704.OMNY-1000-PRO;
request.get(url, function (err, response, body) {
  console.log(body);
   $ = cheerio.load(body);
   console.log($(".description").html());
});

И в качестве вывода я вижу контент, но в нечитаемой странной кодировке:

//Plain body console.log(body) (p.s. russian chars): 
<h1><span style="font-size: 16px;">Уличная 3Мп IP HD камера OMNY - попробуйте найти лучше</span></h1><p style

//  cheerio's console.log $(".description").html()
<h1><span style="font-size: 16px;">&#x423;&#x43B;&#x438;&#x447;&#x43D;&#x430;&#x44F; 3&#x41C;&#x43F; IP HD &#x43A;&#x430;&#x43C;&#x435;&#x440;&#x430; OMNY

Кодировка целевого URL-адреса — в формате UTF-8. Так почему Cheerio ломает мою кодировку?

Попытка использовать iconv для кодирования ответа моего тела:

var body1 = iconv.decode(body, "utf-8");

но console.log($(".description").html()); по-прежнему возвращает странный текст.


person MeetJoeBlack    schedule 22.07.2015    source источник
comment
проверьте этот ответ в отношении кодирования stackoverflow.com/questions/23805566/   -  person snozza    schedule 23.07.2015
comment
нет, результат тот же :(   -  person MeetJoeBlack    schedule 23.07.2015


Ответы (2)


Чирио ничего не сломал. Он выводит HTML-сущности, которые будут отображаться любым браузером точно так же как ввод HTML. Запустите этот фрагмент, чтобы увидеть, что я имею в виду:

<h1><span style="font-size: 16px;">Уличная 3Мп IP HD камера OMNY - попробуйте найти лучше</span></h1>

<h1><span style="font-size: 16px;">&#x423;&#x43B;&#x438;&#x447;&#x43D;&#x430;&#x44F; 3&#x41C;&#x43F; IP HD &#x43A;&#x430;&#x43C;&#x435;&#x440;&#x430; OMNY - &#x43F;&#x43E;&#x43F;&#x440;&#x43E;&#x431;&#x443;&#x439;&#x442;&#x435; &#x43D;&#x430;&#x439;&#x442;&#x438; &#x43B;&#x443;&#x447;&#x448;&#x435;</span></h1>

Например, &#x423; — это символ У, закодированный как объект HTML, точно так же, как объект &gt; представляет >.

Однако, если вы хотите получить незакодированный текст, вы можете установить для параметра decodeEntities значение false:

const $ = cheerio.load(
  `<h1><span style="font-size: 16px;">Уличная 3Мп IP HD камера OMNY - попробуйте найти лучше</span></h1>`,
  { decodeEntities: false }
);


console.log($('span').html())
// => Уличная 3Мп IP HD камера OMNY - попробуйте найти лучше
.as-console-wrapper{min-height:100%}
<script src="https://bundle.run/[email protected]"></script>

person Jordan Running    schedule 22.07.2015
comment
Это позволяет также избежать первого символа, добавленного в вывод Cheerio, спасибо. - person Bruno J. S. Lesieur; 15.02.2016
comment
Благодарю вас! Ваше решение работает и для gulp-cheerio. Я только что использовал эту опцию следующим образом: decodeEntities: false } })) - person Johnny Svarog; 05.04.2017

Сегодня рано утром у меня возникла проблема, когда я попытался загрузить с помощью cheerio страницу, на которой у нас были специальные символы, такие как ç, á, é и т. д.

Принцип работы Cheerio заключается в том, что он пытается декодировать символы по своей природе и представлять числовую HTML-кодировку символа Unicode.

например: вместо ç это даст нам &#xE7;.

Чтобы решить эту проблему, мне просто пришлось отключить эту конфигурацию, добавив: decodeEntities: false в качестве параметра загрузки cheerio.

const $ = cheerio.load(body, { decodeEntities: false });
person costargc    schedule 20.10.2019