【问题标题】:Get value from nested JavaScript object in CasperJS从 CasperJS 中的嵌套 JavaScript 对象获取值
【发布时间】:2015-03-12 17:39:53
【问题描述】:

我正在尝试挖掘嵌套的 javascript 数组以获取对象的第一个实例。代码如下:

var utils = require('utils');
var casper = require('casper').create();

casper.start('http://en.wikipedia.org/wiki/List_of_male_tennis_players', function() {
  this.echo(this.getTitle());

  // Get info on all elements matching this CSS selector
  var tennis_info_text = this.evaluate(function() {
    var nodes = document.querySelectorAll('table.sortable.wikitable tbody tr');
    return [].map.call(nodes, function(node) { // Alternatively: return Array.prototype.map.call(...
      return node.textContent;
    });
  });

  // Split the array into an array of object literals
  var tennis_data = tennis_info_text.map(function(str) {
    var elements = str.split("\n");
    var data = {
      name       : elements[1],
      birth      : elements[2],
      death      : elements[3],
      country    : elements[4]
    };
    return data;
  });

  // Dump the tennis_names array to screen
  utils.dump(tennis_data.slice(1,5));
});

casper.run();

stdout的结果是这样的:

{
    "name": "Acasuso, JoséJosé Acasuso",
    "birth": "1982",
    "death": "–",
    "country": " Argentina"
},
{
    "name": "Adams, DavidDavid Adams",
    "birth": "1970",
    "death": "–",
    "country": " South Africa"
},...

对于name 元素,我从tr 行获取所有内容,当您查看目标网址源时,该行匹配2 个元素。我想要的只是“fn”类的名称元素的第二部分;例如:“大卫·亚当斯”、“何塞·阿卡苏索”。我在想像name:elements[1].smtg 这样的东西应该可以工作,但我没有运气。

此外,我如何从elements 对象打印可用的对象键?

【问题讨论】:

  • 您的代码中没有element 对象。
  • 我的意思是 elements 对象..
  • elements 是一个字符串数组,因此除了数组索引和数组函数之外没有可以访问的键。我通过对问题的描述稍微扩展了我的答案。

标签: javascript arrays object casperjs associative


【解决方案1】:

问题是第一个单元格包含两个元素,其中包含具有不同顺序的玩家的姓名和名字。当获取整个单元格的textContent 时,两个名称表示都放入同一个字符串中,但在浏览器中只有一个可见。如果您只想访问可见的,则需要显式抓取它。

您可以编写一个自定义函数来从字符串中删除重复的名称,但只取正确元素的textContent 会更容易。

这可以在页面上下文中轻松完成:

var tennis_data = this.evaluate(function() {
    var nodes = document.querySelectorAll('table.sortable.wikitable tbody tr');
    return [].map.call(nodes, function(node) {
        var cells = [].map.call(node.querySelectorAll("td"), function(cell, i){
            if (i === 0) {
                return cell.querySelector(".fn").textContent;
            } else {
                return cell.textContent;
            }
        });
        return {
            name: cells[0],
            birth: cells[1],
            ...
        }
    });
});

另外,我如何从elements 对象打印可用的对象键?

elements 是一个字符串数组,因此除了数组索引和数组函数之外,没有可以访问的键。

【讨论】:

  • 我看到你在这里做了什么,但是当我运行它时我得到一个 syntax error: parse error .. 这就是我目前所拥有的 @987654321 @
  • 您可能在某处缺少}});(可能两者都有)。使用适当的缩进,你会很快发现问题。
  • 您还尝试返回data 两次。第二个return 是无法访问的代码。
  • 这对伙计们很有帮助。这个问题实际上是无与伦比的括号..这是最终的工作版本http://chopapp.com/#lsnv1zdt谢谢
猜你喜欢
  • 2018-05-10
  • 1970-01-01
  • 2018-10-14
  • 1970-01-01
  • 2021-09-21
  • 1970-01-01
  • 1970-01-01
  • 2013-10-11
  • 2012-11-12
相关资源
最近更新 更多