node.js中抓取utf-8编码的网页为什么也是乱码

抓取这个网页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("获取失败")
    })

})
阅读 5.6k
评论
    4 个回答
    • 751

    这个不是编码的问题,编码确实是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会更加方便一些。

      发送header头

        • 3.9k

        superAgent 表示毫无压力 ...

        superagent
          .get('http://www.runoob.com/nodejs/nodejs-tutorial.html')
          .end(function (err, sres) { // callback
            fs.writeFileSync("1122.txt", sres.text);
          });

          因为这个网页的内容是 gzip 压缩的,接收数据后需要解压缩方能正确显示网页内容。

          var http = require("http");
          var zlib = require("zlib");
          
          http.get("http://www.runoob.com/nodejs/nodejs-tutorial.html",function(res){
            var html = [];
            var contentEncoding = res.headers["content-encoding"];
            res.on("data", function(data){
              html.push(data);
            }).on("end",function(){
              var body = Buffer.concat(html);
              if (contentEncoding === "gzip") {
                html = zlib.gunzipSync(body);
              }
              console.log(html.toString());
            }).on("error",function(){
              console.log("获取失败")
            })
          });
            撰写回答

            登录后参与交流、获取后续更新提醒