从 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();
标准输出的结果是这样的:
{
"name": "Acasuso, JoséJosé Acasuso",
"birth": "1982",
"death": "–",
"country": " Argentina"
},
{
"name": "Adams, DavidDavid Adams",
"birth": "1970",
"death": "–",
"country": " South Africa"
},...
对于 name
元素,我从 tr
行获取所有内容,当您查看目标 url 源时,它匹配 2 个元素。我想要的只是名称元素的第二部分 class "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],
...
}
});
});
Additionally, how would I print the available object keys from the elements
object?
elements
是一个字符串数组,因此除了数组索引和数组函数之外,您没有可以访问的键。
我正在尝试深入研究嵌套的 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();
标准输出的结果是这样的:
{
"name": "Acasuso, JoséJosé Acasuso",
"birth": "1982",
"death": "–",
"country": " Argentina"
},
{
"name": "Adams, DavidDavid Adams",
"birth": "1970",
"death": "–",
"country": " South Africa"
},...
对于 name
元素,我从 tr
行获取所有内容,当您查看目标 url 源时,它匹配 2 个元素。我想要的只是名称元素的第二部分 class "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],
...
}
});
});
Additionally, how would I print the available object keys from the
elements
object?
elements
是一个字符串数组,因此除了数组索引和数组函数之外,您没有可以访问的键。