【问题标题】:Node.JS scrape encoding?Node.JS 抓取编码?
【发布时间】:2012-09-07 23:35:16
【问题描述】:

我在 Node.JS 中使用 this request library 获取 this page,并使用 cheerio 解析正文。

在解析后的响应正文上调用$.html() 显示页面的标题属性是:

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

...应该是什么时候:

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

我尝试将请求库的选项设置为包含encoding: 'utf8',但这似乎没有任何改变。

如何保留这些字符?

【问题讨论】:

  • cheerio 也可能只是显示 this bug,它在某些情况下会错误地输出某些字符

标签: node.js unicode encoding


【解决方案1】:

您可以使用iconv(或更好的iconv-lite)进行转换本身,但要检测编码,您应该查看charsetjschardet 模块。下面是它们的一个例子:

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

【讨论】:

  • 我认为这是一个更好的答案,因为它考虑了响应标头。
  • 是的,这绝对是一个更好的答案,应该被接受
  • 这应该是正确的答案。它巧妙地使用了所有可用的手段(除了询问网站的开发者)来检测编码并且它成功了!
  • 请注意,jschardet v2.2.1 将返回 'UTF-8',将其变为小写后将与 'utf8' 不匹配。
【解决方案2】:

页面似乎使用 iso-8859-1 编码。您需要告诉request 通过传递encoding: null 将未编码的缓冲区交还给您,并使用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 ..                                                                             
});                                                                             

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-31
    相关资源
    最近更新 更多