Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/473.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript CasperJS在节点列表中返回空元素_Javascript_Document_Casperjs_Nodelist - Fatal编程技术网

Javascript CasperJS在节点列表中返回空元素

Javascript CasperJS在节点列表中返回空元素,javascript,document,casperjs,nodelist,Javascript,Document,Casperjs,Nodelist,以下是我正在运行的脚本: //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

以下是我正在运行的脚本:

//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\u arr
中的许多元素为空。如果我在
console.log
语句周围添加
If(elem!=null){…}
,这一切都很好,但这不符合要点。当我在Chrome控制台的页面上运行相同的
document.querySelectorAll
时,节点列表中的513个元素都不为空。CasperJS还报告513个元素,但它显示的元素数与null相同。这是怎么回事?页面是否未完全加载?我以前从未使用过CasperJS,如果这是新手犯的错误,我很抱歉

不能使用
evaluate()
从页面上下文返回本机节点元素;您必须将
Array#映射到可使用
JSON.parse进行反序列化的内容

因此,您的
getSchools()
函数应该执行以下操作:

function getSchools() {
    var arr = document.querySelectorAll('div.link');
    return Array.prototype.map.call(arr, function(elem) {
        return elem.innerHTML;
    });
}
虽然我不知道如何处理节点innerHTML字符串内容…但通常最好将元素映射到所需的确切属性:

function getSchools() {
    var arr = document.querySelectorAll('div.link a');
    return Array.prototype.map.call(arr, function(elem) {
        return elem.getAttribute('href');
    });
}
编辑:根据评论中的要求,获取所有链接的内部文本:

function getSchools() {
    var arr = document.querySelectorAll('div.link a');
    return Array.prototype.map.call(arr, function(elem) {
        return elem.textContent;
    });
}

这似乎很有道理,但确切的getSchools方法(最上面的方法)似乎在映射后返回
null
。。。知道为什么它会使整个数组为空吗?删除map调用会让我回到原来的位置,即带有null元素的非null数组……因为在page env和casper/phantom之间没有简单的桥接;请记住,您可以从evaluate()调用中检索的内容始终是可通过
JSON序列化的内容。stringify
(HTMLElements、NodeList不是)那么,如果您的答案不起作用,首选的方法是什么?我想要的是页面上所有div的文本内容,类为“link”。这真的不应该太难。@NiKo遇到了类似的问题,我认为应该在casper的文档中说明,因为在你说出来之前这是不明显的。