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);
});
})