2012-09-07 7 views
12

Sto recuperando this page con this request library in Node.JS e analizzando il corpo utilizzando cheerio.Codifica scrape Node.JS?

Calling $.html() sul corpo della risposta analizzato rivela che l'attributo titolo per la pagina è:

<title>Le Relais de l'Entrec?te</title> 

... quando dovrebbe essere:

<title>Le Relais de l'Entrecôte</title> 

Ho provato a installare le opzioni per la libreria richiesta includere encoding: 'utf8', ma ciò non sembra cambiare nulla.

Come conservare questi caratteri?

+0

cheerio potrebbe anche solo esporre [questo bug] (https://github.com/cheeriojs/cheerio/issues/548), il quale emette in modo errato determinati caratteri in determinate situazioni –

risposta

18

La pagina sembra codificata con iso-8859-1. Dovrai comunicare allo request di restituire un buffer non codificato superando encoding: null e utilizzare qualcosa come node-iconv per convertirlo.

Se state scrivendo un cingolato generalizzata, si dovrà capire come rilevare la codifica di ogni pagina si incontra per decodificare correttamente, altrimenti il ​​seguente dovrebbe lavorare per il vostro caso:

var request = require('request');            
var iconv = require('iconv');             

request.get({                 
    url: 'http://www.relaisentrecote.fr',           
    encoding: null,                
}, function(err, res, body) {             
    var ic = new iconv.Iconv('iso-8859-1', 'utf-8');        
    var buf = ic.convert(body);             
    var utf8String = buf.toString('utf-8'); 
    // .. do something with utf8String ..                    
});                    
24

È possibile utilizzare iconv (o meglio iconv-lite) per la conversione stessa, ma per rilevare la codifica è necessario controllare i moduli charset e jschardet. Ecco un esempio di entrambi in azione:

var charset = require('charset'), 
    jschardet = require('jschardet'), 
    Iconv = require('iconv').Iconv; 

request.get({url: 'http://www.example.com', encoding: 'binary'}, function(err, res, body) { 
    var enc = charset(res.headers, body) || jschardet.detect(body).encoding.toLowerCase(); 

    if(enc !== 'utf8') { 
     var iconv = new Iconv(enc, 'UTF-8//TRANSLIT//IGNORE'); 
     body = iconv.convert(new Buffer(body, 'binary')).toString('utf8'); 
    } 

    console.log(body); 
}); 

+2

penso che questa sia una risposta migliore in quanto prende in considerazione l'intestazione di risposta. – leesei

+1

Sì, questa è sicuramente una risposta migliore e dovrebbe essere accettata – Malharhak

+1

Questa dovrebbe essere la risposta corretta. Utilizza intelligentemente tutti i mezzi disponibili (oltre a chiedere allo sviluppatore del sito) di rilevare la codifica e ci riesce! –