Подтвердить что ты не робот

Node.JS scrape encoding?

Я загружаю эту страницу с помощью этой библиотеки запросов в Node.JS и разбор тела с помощью cheerio.

Вызов $.html() в обработанном теге ответа показывает, что атрибут title для страницы:

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

... когда это должно быть:

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

Я попытался установить параметры для библиотеки запросов, чтобы включить encoding: 'utf8', но это ничего не изменило.

Как сохранить эти символы?

4b9b3361

Ответ 1

Похоже, что страница кодируется с помощью iso-8859-1. Вам нужно будет сообщить request, чтобы передать обратно незашифрованный буфер, передав encoding: null и используя для этого node-iconv что-то вроде node-iconv.

Если вы пишете обобщенный искатель, вам нужно выяснить, как определить кодировку каждой страницы, с которой вы сталкиваетесь, чтобы правильно ее декодировать, иначе для вашего случая должно работать следующее:

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 ..                                                                             
});                                                                             

Ответ 2

Вы можете использовать iconv (или лучше iconv-lite) для самого преобразования, но для обнаружения кодировки вы должны проверить charset и jschardet. Вот пример из них как в действии:

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);
});