[英]node-jsdom with loop does't work
我正在嘗試從一系列HTML頁面中抓取數據。 對於訪問,有一些參數由查詢組成。 這些參數保存到json中。 兒子是這樣寫的
[
{"NM":"bla", "Code":"a12312"},
{"NM":"blabla", "Code":"a11231"},
{"NM":"dog", "Code":"b12311"},
...]
下一個是parsing1.js的代碼
var jsdom = require("jsdom");
var schCD = require('./ggElemCD.json');
for(i in schCD){
jsdom.env("http://www.~~skipped~~&HG_CD="+schCD[i].HG_CD+"~~skipped~~", ["http://code.jquery.com/jquery.js"],
function(errors, window){
var tObj= window.$('.TableType1 tbody tr:last td');
console.log( "Name : "+schCD[i].HG_NM);
console.log( "Code : "+schCD[i].HG_CD);
var completeObj = {
"HG_name": schCD[i],
"HG_CD": schCD[i].HG_CD,
"G1st_m" : tObj.get(0).innerHTML,
"G1st_f" : tObj.get(1).innerHTML,
"G2nd_m" : tObj.get(3).innerHTML,
"G2nd_f" : tObj.get(4).innerHTML,
"G3rd_m" : tObj.get(6).innerHTML,
"G3rd_f" : tObj.get(7).innerHTML,
"G4th_m" : tObj.get(9).innerHTML,
"G4th_f" : tObj.get(10).innerHTML,
"G5th_m" : tObj.get(12).innerHTML,
"G5th_f" : tObj.get(13).innerHTML,
"G6th_m" : tObj.get(15).innerHTML,
"G6th_f" : tObj.get(16).innerHTML,
"sp_m" : tObj.get(18).innerHTML,
"sp_f" : tObj.get(19).innerHTML
}
console.log("value1 : "+completeObj.G1st_m);
console.log("value2 : "+completeObj.G1st_f);
});
}
如果刪除了for語法並將HG_CD手動放入此代碼中,則它將正常工作。 但是,當我插入一個for語法時,節點會打印出錯誤消息。
/Users/Snark/Dev/parsing/parsing1.js:8
var tObj= window.$('.TableType1 tbody tr:last td');
^
TypeError: Cannot read property '$' of undefined
at Object.done (/Users/Snark/Dev/parsing/parsing1.js:8:18)
at reportInitError (/Users/Snark/node_modules/jsdom/lib/jsdom.js:384:12)
at /Users/Snark/node_modules/jsdom/lib/jsdom.js:220:9
at Request._callback (/Users/Snark/node_modules/jsdom/lib/jsdom/browser/resource-loader.js:159:64)
at self.callback (/Users/Snark/node_modules/jsdom/node_modules/request/request.js:198:22)
at emitOne (events.js:77:13)
at Request.emit (events.js:169:7)
at Request.onRequestError (/Users/Snark/node_modules/jsdom/node_modules/request/request.js:820:8)
at emitOne (events.js:77:13)
at ClientRequest.emit (events.js:169:7)
您的問題與並發請求有關,因為您似乎有多個請求,因此您應該等待請求完成,然后再向同一服務器發出另一個請求。 以下是使用異步庫完成此操作的方法 :
var jsdom = require("jsdom");
var async = require("async");
var schCD = require('./ggElemCD.json');
async.eachSeries(schCD, function(item, callback){
jsdom.env(
"http://www.~~skipped~~&HG_CD=" + item.HG_CD + "~~skipped~~",
["http://code.jquery.com/jquery.js"],
function(err, window){
var tObj= window.$('.TableType1 tbody tr:last td');
console.log( "Name : " + item.HG_NM);
console.log( "Code : " + item.HG_CD);
var completeObj = {
"HG_name" : item,
"HG_CD" : item.HG_CD,
"G1st_m" : tObj.get(0).innerHTML,
"G1st_f" : tObj.get(1).innerHTML,
"G2nd_m" : tObj.get(3).innerHTML,
"G2nd_f" : tObj.get(4).innerHTML,
"G3rd_m" : tObj.get(6).innerHTML,
"G3rd_f" : tObj.get(7).innerHTML,
"G4th_m" : tObj.get(9).innerHTML,
"G4th_f" : tObj.get(10).innerHTML,
"G5th_m" : tObj.get(12).innerHTML,
"G5th_f" : tObj.get(13).innerHTML,
"G6th_m" : tObj.get(15).innerHTML,
"G6th_f" : tObj.get(16).innerHTML,
"sp_m" : tObj.get(18).innerHTML,
"sp_f" : tObj.get(19).innerHTML
};
console.log("value1 : " + completeObj.G1st_m);
console.log("value2 : " + completeObj.G1st_f);
callback(err);
}
);
}, function (err){
console.log("Done.");
err && console.log(err);
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.