Nodejs抓取非utf8字符编码的页面

Nodejs抓取非utf8字符编码的页面 - MK2 - 博客园

Nodejs抓取非utf8字符编码的页面

问题: nodejs目前无法处理非utf8编码以外的字符

在cnodejs用户组,有同学遇到抓取百度页面出现编码问题

由于Buffer.toString(encoding)中encoding只支持utf8编码,所以需要附加模块才能处理此问题

解决:node-iconv 模块

安装:

$ npm install iconv

示例

var http = require('http');

var options = {
    host
: 'www.baidu.com',
    port
: 80,
    path
: '/s?wd=nodejs'
};

var Iconv = require('iconv').Iconv;

http
.get(options, function(res) {
    console
.log("Got response: " + res.statusCode, res.headers);
   
var buffers = [], size = 0;
    res
.on('data', function(buffer) {
        buffers
.push(buffer);
        size
+= buffer.length;
   
});
    res
.on('end', function() {
       
var buffer = new Buffer(size), pos = 0;
       
for(var i = 0, l = buffers.length; i < l; i++) {
            buffers
[i].copy(buffer, pos);
            pos
+= buffers[i].length;
       
}
       
// 'content-type': 'text/html;charset=gbk'
       
// 百度返回的页面数据流竟然还无法使用gbk完全解码。。
       
var gbk_to_utf8_iconv = new Iconv('GBK', 'UTF-8//TRANSLIT//IGNORE');
       
var utf8_buffer = gbk_to_utf8_iconv.convert(buffer);
        console
.log(utf8_buffer.toString());
   
});
}).on('error', function(e) {
    console
.log("Got error: " + e.message);
});

具体页面编码可以根据res.headers['content-type'] 来判断。
如果没有res.headers['content-type'],则需要分析html的 Content-Type 来判断charset了

“{meta http-equiv="Content-Type" content="text/html; charset=xxxx"/}”

更多url相关请求,可以使用urllib库实现

posted on 2013-01-09 16:17  lexus 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/lexus/archive/2013/01/09/2853138.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值