抓取这个网页http://www.runoob.com/nodejs/...出现乱码,网页编码为utf-8,用过iconv-lite还是不行,这是为什么?
var http=require("http");
var go=require("iconv-lite")
http.get("http://www.runoob.com/nodejs/nodejs-tutorial.html",function(res){
var html="";
res.on("data",function(data){
/* html +=go.decode(data,"gb2312");*/
html+=data;
})
res.on("end",function(){
console.log(html);
}).on("error",function(){
console.log("获取失败")
})
})
_________________________________________________________________________________________
https://segmentfault.com/q/1010000007540588?_ea=13831
这个不是编码的问题,编码确实是utf-8
,但是这个网页使用gzip
进行了压缩,所以请求之后需要先进行ungzip
。
推荐使用request
,可以比较方便的解决这个问题,只需要添加一个参数:
var request = require('request');
request({
url: 'http://www.runoob.com/nodejs/nodejs-tutorial.html',
gzip: true
}, function(err, response, body) {
console.log(body);
});
补充一下不用第三方包的写法:
var http = require("http");
var zlib = require('zlib');
http.get("http://www.runoob.com/nodejs/nodejs-tutorial.html", function(res) {
var html = [];
res.on("data", function(data) {
html.push(data);
})
res.on("end", function() {
var buffer = Buffer.concat(html);
zlib.gunzip(buffer, function(err, decoded) {
console.log(decoded.toString());
})
}).on("error", function() {
console.log("获取失败")
})
})
数据是gzip压缩后的数据,所以建议不要直接使用字符串拼接,而是采用Buffer的concat方法。之后使用自带的zlib进行gunzip
即可。
这个写法只是针对这一个问题而已,实际应用中需要自己去判断返回内容的encoding。当然了,第三方的工具,比如request和楼下的superAgent会更加方便一些。