Node.JS刮编码?

我使用Node.JS中的 这个请求库来获取这个页面 ,并使用cheerioparsing正文。

在parsing的响应正文上调用$.html()发现页面的title属性是:

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

…当它应该是:

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

我已经尝试设置请求库的选项,包括encoding: 'utf8' ,但似乎没有改变任何东西。

我如何保留这些字符?

该页面似乎用iso-8859-1编码。 你需要通过传递encoding: null并使用像node-iconv这样的东西来转换它来告诉request通过传递一个未经编码的缓冲区。

如果你正在编写一个通用的爬虫程序,你必须弄清楚如何检测你遇到的每个页面的编码,以正确解码,否则以下应该适用于你的情况:

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

您可以使用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); });