使用iconv 从gb2312转utf-8经常出错
发布于 2年前 作者 qq277049 2648 次浏览
/**
 * 采集39问答网
 */

var n = require('needle')
var $ = require('jquery')
var iconv = require('iconv').Iconv;
n.get('http://ask.39.net/browse/313-2-1.html',{encoding:'gb2312'},function(error,response,body){
    //console.log(response.statusCode)
    var buf = new Buffer(body,'binary');
    var content = new iconv('gb2312','UTF8').convert(buf).toString()
    //采集到的链接
    var href = {}
    $(content).find('.bt').each(function(index,value){
        href[$(value).attr('href')] = $(value).attr('href')
    })
    console.log(href)
})

经常出现下面的错误。

         throw errnoException('EILSEQ', 'Illegal character sequence.');
                ^
Error: Illegal character sequence.
    at errnoException (D:\node.js\node_modules\iconv\lib\iconv.js:137:13)
    at convert (D:\node.js\node_modules\iconv\lib\iconv.js:85:17)
    at Iconv.convert (D:\node.js\node_modules\iconv\lib\iconv.js:108:12)
    at D:\node.js\cj39.js:11:46
    at handle_output (D:\node.js\node_modules\needle\lib\needle.js:227:16)
    at Object.Needle.response_end (D:\node.js\node_modules\needle\lib\needle.js:242:7)
    at IncomingMessage.<anonymous> (D:\node.js\node_modules\needle\lib\needle.js:187:16)
    at IncomingMessage.EventEmitter.emit (events.js:117:20)
    at _stream_readable.js:883:14
    at process._tickCallback (node.js:415:13)
3 回复

(iconv:大人,这不是小人的错呀,错的是大…大…,错的是这个世界。) 吐槽完毕,先赞一个,这是近期看到规格最完备的求助帖,有代码有报错,难得,虽然代码贴重复一部分,虽然犯的错比较低级。。。

如果确定抓取的网页编码是gb2312,那么needle抓取后没必要转码。

var buf = new Buffer(body,'binary');
var content = new iconv('gb2312','UTF8').convert(buf).toString()

这2句可以删除,body本身已经是utf-8,可console.log(body)验证。why?见needle文档response options的decode选择说明:https://github.com/tomas/needle#response-options 另外{encoding:'gb2312'}的作用是指定post数据的编码,与response无关。

吧这两行代码删除掉console出来的是乱码。必须要转,但是转码经常会出现错误。

@qq277049

var n = require('needle'),
fs=require('fs');
n.get('http://ask.39.net/browse/313-2-1.html',
        {encoding:'gb2312'},
         function(error,response,body){
      fs.appendFileSync('result.html',body);
      //乱码?非也,这是因为win的控制台是gbk编码,如果是unix控制台就
      console.log(body);
})

打开result.html,这是标准的utf8文档。needle内部调用iconv-lite已经转码完毕了。

回到顶部