zoukankan      html  css  js  c++  java
  • 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库实现

  • 相关阅读:
    SDN第二次作业
    SDN第一次上机作业
    SDN第一次作业
    期末作业验收
    SDN第五次上机作业
    SDN第四次上机作业
    SDN第三次作业
    SDN第三次上机作业
    SDN第二次上机作业
    SDN第二次作业
  • 原文地址:https://www.cnblogs.com/lexus/p/2853138.html
Copyright © 2011-2022 走看看