2015-03-12 3 views
1

Я пытаюсь вставить вложенный массив javascript, чтобы захватить первый экземпляр объекта. Вот код:Получить значение из вложенного объекта JavaScript в CasperJS

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

Результат стандартного вывода заключается в следующем:

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

Для name элемента, я получаю все от tr строки, которая соответствует 2 элементу, когда вы смотрите на цели источник url. Я хочу только вторую часть элемента name с классом «fn»; например: «Дэвид Адамс», «Хосе Акасузо». Я думаю, что что-то вроде name:elements[1].smtg должно работать, но мне не повезло.

Кроме того, как бы напечатать доступные ключи объектов с объекта elements?

+0

В коде отсутствует объект 'element'. –

+0

Я имел в виду * elements * object .. – dharkko

+0

'elements' - это массив строк, поэтому нет ключей, к которым вы можете получить доступ, кроме индексов массивов и функций массива. Я немного объяснил свой вопрос описанием проблемы. –

ответ

0

Проблема в том, что первая ячейка содержит два элемента, которые содержат имя и имя игрока с различным порядком. При принятии 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], 
      ... 
     } 
    }); 
}); 

Additionally, how would I print the available object keys from the elements object?

elements представляет собой массив строк, так что нет ключей, которые вы можете получить доступ помимо индексов массивов и функций массива.

+0

Я вижу, что вы здесь делаете, но я получаю синтаксическую ошибку: ошибка синтаксического анализа *, когда я запускаю ее. Вот что у меня есть на данный момент [http://chopapp.com/#ctbxsdqt](http : //chopapp.com/#ctbxsdqt) – dharkko

+0

Возможно, вам не хватает '}' или '});' где-то (может быть, и то, и другое). Используйте правильный отступ, и вы быстро найдете проблему. –

+0

Вы также пытаетесь вернуть 'data' два раза. Второй «возврат» - недостижимый код. –

 Смежные вопросы

  • Нет связанных вопросов^_^