Javascript 函数中的CasperJS querySelectorAll(变量)不返回任何结果
我正在编写一个网站刮板,从一个没有实际链接、只有可点击文本的ajax网站上抓取一些特定内容。我现在只使用javascript大约一个星期了,我正在使用CasperJS,因为它将减少很多工作 我发现的问题是,我正在编写多个函数,它们都做相同的事情,只是根据它所在的页面搜索不同的链接。 因此,我:Javascript 函数中的CasperJS querySelectorAll(变量)不返回任何结果,javascript,phantomjs,casperjs,selectors-api,Javascript,Phantomjs,Casperjs,Selectors Api,我正在编写一个网站刮板,从一个没有实际链接、只有可点击文本的ajax网站上抓取一些特定内容。我现在只使用javascript大约一个星期了,我正在使用CasperJS,因为它将减少很多工作 我发现的问题是,我正在编写多个函数,它们都做相同的事情,只是根据它所在的页面搜索不同的链接。 因此,我: function getLinks() { var links = document.querySelectorAll('div.AjaxLink h3'); return Array.p
function getLinks() {
var links = document.querySelectorAll('div.AjaxLink h3');
return Array.prototype.map.call(links, function(link) {
return link.innerText;
});
}
其运行方式为:
casper.then(function() {
var myLinks = this.evaulate(getLinks);
/* ... link manipulation code code ... */
});
这个很好用。很明显,我不希望有半打函数只是有一个不同的查询字符串。所以我想做的是:
function getLinks(findText) {
var links = document.querySelectorAll(findText);
return Array.prototype.map.call(links, function(link) {
return link.innerText;
});
}
然后我尝试通过以下方式运行它:
casper.then(function() {
var myLinks = getLinks('div.AjaxLink h3');
/* ... link manipulation code code ... */
});
findText变量已正确传入,但查询选择器似乎始终返回空节点列表
我做错了什么?document是在该函数中创建的空文档吗?CasperJS构建在PhantomJS之上。PhantomJS有两个上下文。可通过访问的沙盒页面上下文和可访问
的外部上下文需要和幻影。奇怪的是,这两个上下文都可以访问窗口
和文档
,但是文档
在外部上下文中没有任何意义,因为DOM是空的。这就是为什么querySelectorAll()
找不到元素的原因。只能通过evaluate()
访问页面DOM
因此,您需要在中执行函数。函数的附加参数被传递到evaluate()
中,而不是传递给函数:
function getLinks(findText) {
...
}
casper.then(function() {
var myLinks = this.evaluate(getLinks, 'div.AjaxLink h3'); // THIS
...
});
页面底部还有一个重要提示:
注意:参数和evaluate
函数的返回值必须是一个简单的原语对象。经验法则:如果可以通过JSON对其进行序列化,那么就可以了
闭包、函数、DOM节点等将无法工作强>