我正在使用Casperjs来抓取一个网站,并且我正在尝试提取包含列表的特定div。我正在抓取的页面的简化版本是:
<div id="col1" style="margin-top: 1px; ">
<div class="portlet_my_classes" id="my_classes">
<div class="eclass_list">
<ul>
<li>First item</li>
</ul>
</div>
</div>
</div>
我的脚本脚本如下:
var casper = require('casper').create()
var classes = []
function getClasses() {
var classes = document.querySelector(".eclass_list")
return Array.prototype.map.call(classes, function(e) {
return e.textContent
})
}
casper.start('https://redacted', function() {
this.echo(this.getTitle());
this.fill('form[action="/do/account/login"]', {login: "redacted", password: "redacted"}, true)
});
casper.then(function() {
this.echo(this.getHTML())
})
casper.thenOpen('https://redacted', function() {
this.echo(this.getTitle())
this.echo(this.getHTML())
this.echo(this.evaluate(getClasses))
this.echo(this.exists(".eclass_list"))
require('utils').dump(this.getElementInfo(".eclass_list"))
classes = this.evaluate(getClasses)
})
casper.run(function() {
this.echo(classes).exit()
});
this.exists(".eclass_list")
返回true,但类始终为null。
答案 0 :(得分:3)
document.querySelector(".eclass_list")
函数中的 getClasses
将仅返回具有此类的第一个元素,而不是作为数组而是作为元素。因此,对DOM元素的后续Array.prototype.map
调用将失败,因为DOM元素没有length
属性且无法解释为数组。由于页面上下文中存在例外(Chrome中为SyntaxError: Illegal return statement
),因此返回值为null
。
你想要的是document.querySelectorAll(".eclass_list")
。
如果你已经添加了remote.message
和page.error
个事件,那么你会看到问题。