2012-09-07 13 views
12

Voy a buscar this page con this request library en Node.JS, y analizo el cuerpo usando cheerio.Node.JS scrape codificación?

Calling $.html() en el cuerpo de la respuesta analizada revela que el atributo título de la página es:

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

... cuando debería ser:

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

He tratado de establecer las opciones para que la biblioteca de solicitud incluya encoding: 'utf8', pero eso no parece cambiar nada.

¿Cómo puedo conservar estos caracteres?

+0

cheerio podría también acaba de presentar [este error] (https://github.com/cheeriojs/cheerio/issues/548), que imprime incorrectamente ciertos caracteres en ciertas situaciones –

Respuesta

18

La página parece estar codificada con iso-8859-1. Necesitará decirle al request que le devuelva un búfer no codificado al pasar encoding: null y usar algo como node-iconv para convertirlo.

Si estás escribiendo un rastreador generalizada, que tendrá que encontrar la manera de detectar la codificación de cada página se encuentra con decodificarlo correctamente, de lo contrario el siguiente debe trabajar para su 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

Puede usar iconv (o mejor iconv-lite) para la conversión en sí, pero para detectar la codificación debe consultar los módulos charset y jschardet. He aquí un ejemplo de ellos tanto en la acción:

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

Creo que esta es una mejor respuesta ya que toma en cuenta el encabezado de respuesta. – leesei

+1

Sí, esta es definitivamente una mejor respuesta y debería ser la aceptada – Malharhak

+1

Esta debería ser la respuesta correcta. Utiliza hábilmente todos los medios disponibles (además de pedirle al desarrollador del sitio) que detecte la codificación y lo logra. –

Cuestiones relacionadas