Question Node.JS gratter l'encodage?


Je vais chercher cette page avec avec cette bibliothèque de requêtes dans Node.JS, et l'analyse du corps en utilisant cheerio.

Appel $.html() sur le corps de réponse analysé révèle que l'attribut title de la page est:

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

... quand ça devrait être:

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

J'ai essayé de définir les options de la bibliothèque de requêtes à inclure encoding: 'utf8', mais cela ne semblait rien changer.

Comment conserver ces personnages?


12
2017-09-07 23:35


origine


Réponses:


La page semble être encodée avec iso-8859-1. Vous devrez dire request pour vous remettre un tampon non encodé en passant encoding: null et utiliser quelque chose comme node-iconv pour le convertir

Si vous écrivez un robot d'indexation généralisé, vous devrez déterminer comment détecter l'encodage de chaque page que vous rencontrez pour le décoder correctement. Sinon, les éléments suivants devraient fonctionner dans votre cas:

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

19
2017-09-08 00:37



Vous pouvez utiliser iconv (ou mieux iconv-lite) pour la conversion elle-même, mais pour détecter le codage, vous devez vérifier le charset et jschardet modules. Voici un exemple des deux en action:

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


27
2017-09-10 06:27