【问题标题】:Using XPath with CasperJS QuerySelectorAll not working将 XPath 与 CasperJS QuerySelectorAll 一起使用不起作用
【发布时间】:2013-03-24 07:26:12
【问题描述】:

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

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();

返回一个空对象,但是当我将相同的 xpath 选择器与 thenClick 方法结合使用时,一切正常,并且 url 发生了变化。为什么会这样?

【问题讨论】:

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


    【解决方案1】:

    所以,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');
    

    黑客愉快

    【讨论】:

    • 这不是 CasperJS 的 querySelectorAll() 方法......它是浏览器的。该规范仅适用于 CSS 选择器:w3.org/TR/selectors-api XPath 表达式虽然用于选择事物,但完全是一个不同的家族。
    【解决方案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');
    });
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-15
      • 1970-01-01
      • 2011-06-14
      • 1970-01-01
      • 1970-01-01
      • 2021-03-31
      • 1970-01-01
      相关资源
      最近更新 更多