2015-07-22 4 views
6

я анализирую мой запрос с Cheerio так:Node.js Cheerio анализатор разбивает UTF-8 кодировке

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. Так почему же Черио ломает мою кодировку?

Попытка использовать Iconv кодировать мое тело к этому товару:

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

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

+0

Установите этот флажок ответ в отношении к работе с кодировкой HTTP://stackoverflow.com/questions/23805566/weird-characters-when-using-console-print-cheerio-nodejs – snozza

+0

nope, все тот же результат :( – MeetJoeBlack

ответ

17

Cheerio ничего не сломал. Выводимый 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 «объект» для символа У UTF-8, таким же образом, сущность &gt; представляет >.

Однако, если вы хотите получить Unencoded текст, вы можете установить 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://wzrd.in/standalone/[email protected]atest"></script>

+2

Thx, {decodeEntities: false} отлично работает! – MeetJoeBlack

+0

Это избегает также firt & # xFEFF; char добавлен в выход Cheerio, thx. –

+0

Спасибо! Ваше решение работает и на gulp-cheerio. Я только что использовал этот параметр: gulp.src ("./ mysrc") .pipe (cheerio ({ run: function ($, file) { // что-то здесь ... }, parserOptions: { xmlMode: true, decodeEntities: false } })) –

Смежные вопросы