使用XPath与CasperJS QuerySelectorAll无法正常工作

时间:2013-04-02 20:22:28

标签: xpath css-selectors web-scraping casperjs selectors-api

出于某种原因,当我尝试运行以下代码时:

var casper = require('casper').create(); 
var x = require('casper').selectXPath;
var links = [];

casper.start('http://www.website.com');

function getLinks() {
    var links = document.querySelectorAll(x('//*[@id="horizontalList"]/li[@class="paddingRight6"]/a');
    return Array.prototype.map.call(links, function(e) {
        return e.getAttribute('href')
    });
}

casper.then(function() {
    links = this.evaluate(getLinks);
    this.echo(links);
}

casper.run();

返回一个null对象,但是当我使用与thenClick方法相同的xpath选择器时,一切正常并且url会发生变化。究竟是为什么呢?

2 个答案:

答案 0 :(得分:10)

因此,事实证明querySelectorAll方法实际上并不支持XPath。实际上它根本不是来自casperjs,而是由浏览器支持,这就是它接受CSS3选择器而不是XPath的原因。我很难弄明白这一点,所以我想我会把它放在一起以防其他人遇到这个问题。你必须在casperjs中使用CSS3选择器,所以行:

var links = document.querySelectorAll(x('//*[@id="horizontalList"]/li[@class="paddingRight6"]/a');

需要改为:

var links = document.querySelectorAll('ul#horizontalList li.paddingRight6 a');

快乐的黑客攻击

答案 1 :(得分:2)

以下功能适用于Xpath。

function getLinks() {   
var links =__utils__.getElementsByXPath('//*[@id="horizontalList"]/li[@class="paddingRight6"]/a');
    return Array.prototype.map.call(links, function(e) {
    return e.getAttribute('href');
});
}