querySelectorAll 无法识别 var

2024-01-09

我正在使用 casperjs 进行一些网络抓取,但遇到了一个奇怪的问题。 我希望能够从字符串构造 CSS 路径并使用“querySelectorAll”获取数组,如下所示:

var tier = '-ou-';
var index = 'div.list > div > a[href*="' + tier + '"]';
var battles = document.querySelectorAll(index);

然而,这不起作用,battles 返回 null。

这个版本的工作原理:

var links = document.querySelectorAll('div.list > div > a[href*="-ou-"]');

但没有其他人这样做。 我也尝试过:

var index = 'div.list > div > a[href*="-ou-"]';
var battles = document.querySelectorAll(String(index));

and

var index = 'div.list > div > a[href*="-ou-"]';
var battles = document.querySelector(index);

以及上述所有组合,只是作为健全性检查,但没有一个起作用。我对 javascript 比较陌生,所以我觉得我可能遗漏了一些明显的东西,但我不知道是什么。

编辑: 我的整个程序如下。照原样,它工作得很好。如果使用 getBattles 中的注释行而不是下面的行,则它不再有效(var 'battles' 变为 null)

var casper = require('casper').create();
var url = 'http://play.pokemonshowdown.com/';
var battles = [];
var tier = '-ou-';
var index = "div.list > div > a[href*=\"" + tier + "\"]";

function getBattles() {
    //var battles = document.querySelectorAll(index);
    var battles = document.querySelectorAll('div.list > div > a[href*="-ou-"]');
    return Array.prototype.map.call(battles, function(e) {
        return e.getAttribute('href');
    });
}

casper
  .start(url)
  .then(function() {
    if(this.exists('div.leftmenu')) {
      this.echo('something works');
    }
    else {
      this.echo('nothing works');
    }
  })
  .thenClick('button[name="roomlist"]')
  .then(function(){
    this.echo("This one is done.");
  })
  .waitForSelector('div.list > div > a', function(){
    battles = this.evaluate(getBattles);
    this.echo(this.getHTML('div.list > div:nth-child(2) > a'));
  })
  .then(function(){
    this.echo("This two is done.");
  });

casper.run(function() {

    this.echo(battles.length + ' battles found:');
    this.echo(' - ' + battles.join('\n - ')).exit();
});

CasperJS 和 PhantomJS 有两个上下文。通过编程的内部上下文casper.evaluate() http://docs.casperjs.org/en/latest/modules/casper.html#evaluate是沙盒的。这意味着它无法访问外部定义的变量。您需要显式传递这些变量:

var index = 'div.list > div > a[href*="' + tier + '"]';

function getBattles(innerIndex) {
    var battles = document.querySelectorAll(innerIndex);
    return Array.prototype.map.call(battles, function(e) {
        return e.getAttribute('href');
    });
}
...
battles = casper.evaluate(getBattles, index);

PhantomJS 文档evaluate() http://phantomjs.org/api/webpage/method/evaluate.html有一个重要的注意事项:

Note:参数和返回值evaluate函数必须是一个简单的原始对象。经验法则:如果可以通过 JSON 序列化,那就没问题了。

闭包、函数、DOM 节点等将not work!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

querySelectorAll 无法识别 var 的相关文章

随机推荐

  • 如何在 Angular 2 Typescript 中复制到剪贴板?

    有没有办法在 Angular2 Typescript 框架中复制剪贴板 多浏览器 中的文本 我只找到使用 Javascript 的来源 例如 document execCommand copy 您可以围绕以下内容实现 Angular2 指令
  • MIPS 上适用于 Android 的免费 Pascal

    尝试将 Delphi 库移植到 Android Free Pascal 支持 Android ARM 可以使用适用于 Windows 的预构建编译器 不过 Android NDK 现在也支持 MIPS 和 x86 FPC 人员的支持状况如何
  • Pandas 插值给出奇怪的结果

    我正在使用 Pandas 及时插值数据点 但是在重采样和插值时 使用不同的重采样率时 相同的插值时间会得到不同的结果 这是一个测试示例 import pandas as pd import datetime data pd DataFram
  • 将 15 添加到 R 中列的每个数字[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我是 R 新手 我正在尝试为特定列的数据集中的每个数字添加 15 并且想知道这是如何实现的 任何帮助将不胜感激 谢谢 假设你有一个 data
  • 如何禁用 DataGridView CheckBox 列中的特定复选框单元格

    我有一个带有 DataGridView 控件的 winForm 它包含 5 列 其中一列是 CheckBox 列 我想根据同一行另一列中存在的值启用 禁用该列的复选框单元格 我可以使用禁用整个列 但它使整个列处于禁用状态 这是 DataGr
  • 在 .js 文件中声明全局变量是不好的做法吗?

    我有一个 js 文件 我正在其中初始化两个使用的参数 在一个单独的函数中 var submyvar1 var submyvar2 function init myvar1 myvar2 submyvar1 myvar1 submyvar2
  • 这种与 splat 运算符的并行赋值在 Ruby 中是如何工作的?

    letters a b c d e first second letters first gt a second gt b c d e 我明白这会产生什么 但无法理解这一点 这基本上是 Ruby 的魔法吗 无法想到任何其他编程语言可以支持使
  • ng-cloak 和 ng-show 在屏幕上闪烁隐藏元素

    我有一个 div 元素 我只想在项目列表为空时显示该元素 所以我输入以下内容 在 haml 中 no items ng cloak ng show gt items length lt 0 ng cloak gt true 然而 即使我完成
  • .net 序列化:如何有选择地忽略数据字段

    在 Net你可以将一个字段标记为不可序列化 并且在序列化过程中它将被跳过 我正在寻找一种简单的方法 它允许我在运行时控制是否应序列化特定字段 您指的是 将字段标记为不可序列化 所以我假设您正在使用BinaryFormatter and No
  • 播放服务广告与 appcompat 冲突

    当我添加implementation com google android gms play services ads 18 2 0 到我的 build gradle Android Studio 亮点implementation com
  • 如何强制mongo以小写形式存储成员?

    我有一个 BsonDocuments 集合 例如 MongoCollection
  • 为什么绑定不适用于动画?

    我对动画绑定属性有一个简单的问题 这是一个简单的例子来说明它 视图模型 public class ViewModel private double myProperty public double MyProperty get return
  • 在 JavaScript 中检测 Lion (OS X 10.7)?

    有没有办法用 Javascript 检测操作系统是否是 OS X Lion Cheers Lion 中 Safari 还有 Firefox 的用户代理类似于 Mozilla 5 0 Macintosh Intel Mac OS X 10 7
  • 如何从 Amazon API Gateway 将查询字符串或路由参数传递到 AWS Lambda

    例如如果我们想使用 GET user name bob or GET user bob 如何将这两个示例作为参数传递给 Lambda 函数 我在文档中看到了有关设置 映射自 的内容 但我在 API Gateway 控制台中找不到该设置 me
  • Kotlin 中具有反向查找功能的有效枚举?

    我正在尝试找到在 Kotlin 中对枚举进行 反向查找 的最佳方法 我从 Effective Java 中得到的收获之一是在枚举中引入静态映射来处理反向查找 使用一个简单的枚举将其移植到 Kotlin 会得到如下所示的代码 enum cla
  • 关于 (POSIX) 信号主题的最佳参考文献是什么?

    信号似乎是概念上应该简单且易于解释的领域之一 但我从未遇到过既全面 清晰又最新的来源 在某种程度上 这似乎是由于历史遗留问题 规则的大量例外 不同的编程标准 混乱的线程 实时添加等 关于 unix linux posix 信号 您写得最好
  • 如何在 Asp.net MVC2 中通过 Ajax 调用处理 UnauthorizedRequest

    Brief 我的框架中有一个子类 AuthorizeAttribute 我在其中进行自定义授权 我正在从普通的 asp net mvc 视图渲染切换到通过 jQuery 的 Ajax 渲染 因此 应用程序中的每个链接都会执行 ajax 调用
  • Firefox 中的内联 SVG

    我对这个有点难住了 我使用 Protovis 一个 JS 库 渲染 SVG 可视化 它在 Chrome 和 Firefox 中运行得非常好 我将渲染的 SVG 保存在我的服务器上 并尝试使用 PHP 函数在 图库 视图中重新渲染它 但这在
  • Python Gtk 3.0:如何在 Notebook 中获取焦点

    我正在尝试将焦点设置为Entry输入字段 如果我把它放在一个Box 我可以通过设置焦点grab focus方法 但如果Entry是在一个里面Notebook 它没有聚焦 示例代码 import gi gi require version G
  • querySelectorAll 无法识别 var

    我正在使用 casperjs 进行一些网络抓取 但遇到了一个奇怪的问题 我希望能够从字符串构造 CSS 路径并使用 querySelectorAll 获取数组 如下所示 var tier ou var index div list gt d