1. 程式人生 > >node js 抓取指定網頁內容gb2312亂碼問題解決

node js 抓取指定網頁內容gb2312亂碼問題解決

                開始思路是用crawler。具體地址在Github上。https://github.com/sylvinus/node-crawler

                它的好處是可以用jquery選擇器,方便快捷的選擇出想要的內容。而且,說明文件宣稱能把幾乎所有的編碼轉化為UTf-8.我信了它整整一天,gb2312的網頁都轉化不了。

後來,貪圖方便的jquery選擇器,所以,一直在研究轉碼,下載了icon-lite。同樣不可以。。直到。。。。。。。。發現了這篇文章

               http://cnodejs.org/topic/5034b141f767cc9a51baf9b0

              原來中文和英文大小不同,總之就是會截取出現一半的中文。所以轉碼形成亂碼。用文章介紹的方式,果斷的出現了中文。。此地真的想哭啊。。

             ok。文章是中文了,可是內容是整個頁面的原始碼。太龐大了。首先想到了xpath。於是繼續不斷的下載,嘗試,下載,嘗試。錯誤都是那一個。

             用的是xpath.js .地址是https://github.com/yaronn/xpath.js

              這個工具可以容易的解析xml內容。可是對於一個大型網頁內容來說,會出現很多很多,前後Tag標籤不對稱的情況,所以,還是失敗。。

             最後, 終於發現,還有一種方法,htmlparse。抱著試一試的態度,下載,安裝。奇蹟發生了,我終於可以抓取自己想要的中文的內容了。。此處哭不停啊

            ok。htmlparse的地址是https://github.com/harryf/node-soupselect

           初學node。程式碼混亂,見諒

         var http = require('http'), 
         

         url = require('url').parse('http://psv.tgbus.com/');

 var iconv = require('iconv-lite');  //用於轉碼 
 

        var BufferHelper = require('bufferhelper');//用於拼接BUffer。防止中文單詞斷裂
        

          var select = require('soupselect').select,//選擇器

         htmlparser = require("htmlparser");

 http.get(url,function(res){

 var bufferHelper = new BufferHelper();

 res.on('data', function (chunk) {
   bufferHelper.concat(chunk);

 });
 res.on('end',function(){ 


   var tex=iconv.decode(bufferHelper.toBuffer(),'GBK');


     var handler = new htmlparser.DefaultHandler(function(err, dom) {
           

              if (err) {
                    //   sys.debug("Error: " + err);
               } else {


                   // soupselect happening here...
                   var titles = select(dom, 'title');


               // sys.puts("Top stories from reddit");
                console.log(JSON.stringify(titles));
                
                 }
           });


           var parser = new htmlparser.Parser(handler);
            parser.parseComplete(tex);


 });
})