簡體   English   中英

從CasperJS中的嵌套JavaScript對象獲取價值

[英]Get value from nested JavaScript object in CasperJS

我試圖挖掘嵌套的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行獲取所有內容,當您查看目標url源時,該行與2個元素匹配。 我想要的只是name元素的第二部分,其中包含“ fn”類; 例如:“ David Adams”,“JoséAcasuso”。 我在name:elements[1].smtg應該起作用,但是我沒有運氣。

另外,我將如何打印來自elements對象的可用對象鍵?

問題在於,第一個單元格包含兩個元素,這些元素包含具有不同順序的播放器的名稱和名字。 當采用整個單元格的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是一個字符串數組,因此除數組索引和數組函數外,沒有其他鍵可訪問。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM