2015-07-22 12 views
6

mi parse la mia richiesta con Cheerio in questo modo:Node.js Cheerio parser rompe codifica 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()); 
}); 

E come uscita vedo contenuto, ma nella codifica strano illeggibile:

//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 di destinazione la codifica del collegamento è in formato UTF-8. Allora perché Cheerio rompe la mia codifica?

Cercando di utilizzare iconv per codificare il mio corpo responce:

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

ma console.log($(".description").html()); restituisce comunque il testo strano.

+0

controllo questa risposta per quanto riguarda fare con la codifica http://stackoverflow.com/questions/23805566/weird-characters-when-using-console-print-cheerio-nodejs – snozza

+0

no, ancora lo stesso risultato :( – MeetJoeBlack

risposta

17

Cheerio non ha rotto nulla. L'HTML che emette sarà reso da qualsiasi browser esattamente uguale all'input HTML. Date un'occhiata a questo frammento:

<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>

E 'solo il caso che &#x423; è il "soggetto" HTML per il carattere UTF-8 У, allo stesso modo l'entità &gt; rappresenta >.

Tuttavia, se si desidera ottenere il testo in chiaro, è possibile impostare l'decodeEntities opzione per 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]"></script>

+2

Thx, {decodeEntities: false} funziona bene! – MeetJoeBlack

+0

Questo evita anche il firt & # xFEFF; char aggiunto nell'output di Cheerio, thx. –

+0

Grazie! La tua soluzione funziona anche per gulp-cheerio. Ho appena usato questa opzione: gulp.src ("./ mysrc") .pipe (cheerio ({ run: function ($, file) { // fai qualcosa qui ... }, parserOptions: { xmlMode: true, decodeEntities: false } })) –