这是我正在运行的脚本:
//Require CasperJS
var casper = require('casper').create();
//Scraping Courserank
var base = "https://www.courserank.com";
var home = base + "/w/home";
var schools = base + "/w/schools?switchSchool=1";
//First, navigate to homepage and login
casper.start(home, function() {
console.log('Logging in...');
//Fill in the login form
this.fill(
'form[action="login"]',
{ username : 'hatboysam@gmail.com', password : "****" },
true
);
});
function getSchools() {
var arr = document.querySelectorAll('div.link');
return arr;
}
//Go to the schools page
casper.then(function() {
console.log(this.getCurrentUrl());
//Open the school choice page
casper.open(schools).then(function() {
console.log(this.getCurrentUrl());
//Get all school links
var schools_arr = this.evaluate(getSchools);
console.log(schools_arr.length);
Array.prototype.map.call(schools_arr, function(elem) {
console.log(elem.innerHTML);
});
});
});
casper.run();
一切都很好,直到 map 调用的内部循环,特别是console.log(elem.innerHTML)
. 中的许多元素schools_arr
为空。如果我if(elem != null) { ... }
在声明周围添加一个,console.log
那一切都很好,但这违背了这一点。当我document.querySelectorAll
在页面上的 Chrome 控制台中运行相同时,NodeList 中的 513 个元素都不是空的。CasperJS 也报告了 513 个元素,但它显示许多为空。这里发生了什么?页面没有完全加载吗?我以前从未使用过 CasperJS,如果这是一个新手错误,我很抱歉。