我正在使用 Node.JS 中的这个请求库来获取这个页面,并使用Cheerio解析正文。
调用$.html()
解析后的响应正文显示页面的标题属性是:
<title>Le Relais de l'Entrec?te</title>
...应该是什么时候:
<title>Le Relais de l'Entrecôte</title>
我尝试将请求库的选项设置为 include encoding: 'utf8'
,但这似乎并没有改变任何东西。
如何保留这些字符?
您可以使用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);
});
该页面似乎使用 iso-8859-1 编码。你需要告诉你通过传递和使用类似node-iconv的东西来转换它来request
交回一个未编码的缓冲区。encoding: null
如果您正在编写通用爬虫,则必须弄清楚如何检测遇到的每个页面的编码以正确解码,否则以下内容应该适用于您的情况:
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 ..
});