CasperJS 循环遍历 table 并为 JSON 输出抓取数据
CasperJS loop through table and scrape data for JSON output
我实际上是在尝试从 CasperJs 的网站获取一些数据。数据存储在 table 中。
我试图在报废后获得一个合适的 JSON 文件。一个 json 与:
- 公司的名称,
- 邮件,
- 网站
- activity 的描述。
到目前为止,我已经能够打开页面并获取数据,但不是很准确(邮件和网站在同一个上)。所以我找到了如何精确地 select 每个我想要的元素。
但在这种情况下,我没有得到所有 table 信息,只有第一行...
我想知道是否有人可以帮助我,告诉我在哪里看或如何在我的情况下进行循环?假设我不是专业开发人员,我正在训练自己。
这是我的代码:
var casper = require('casper').create();
var url = 'http://www.rent2016.fr/pages/exposants';
var fs = require('fs');
var length;
casper.start(url);
casper.then(function() {
this.waitForSelector('table#myTable');
});
casper.then(function(){
var info = this.evaluate(function(){
var table_rows = document.querySelectorAll("tr"); //or better selector
return Array.prototype.map.call(table_rows, function(tr){
return {
nom : document.querySelector(".td-width h3").textContent,
description: document.querySelector(".td-width p").textContent,
mail : document.querySelector("td span a").textContent,
site : document.querySelector('td span a[href^="http"]').textContent,
};
});
});
fs.write('test_rent_stringify.json', JSON.stringify(info), 'w');
this.echo(JSON.stringify(info, undefined, 4));
});
casper.run(function() {
});
在这里,我们没有循环:JSON 重复第一行信息。要获取您必须替换的每一行信息
nom : document.querySelector(".td-width h3").textContent,
来自
nom : tr.children[1].textContent,
但在这种情况下,您无法精确定位 H3、链接……您可以获得所有信息。所以实际上我可以:
遍历行并获取信息,但它们不可用
只有第一行的信息,但表现很好
提前致谢!
为了获取每个元素内部的信息,您必须使用 tr.querySelector 而不是 document.querySelector。
以下循环适用于页面:
var table_rows = document.querySelectorAll("tbody tr"); //or better selector
return Array.prototype.map.call(table_rows, function(tr) {
return {
nom: tr.querySelector(".td-width h3").textContent,
description: tr.querySelector(".td-width p").textContent,
mail: tr.querySelector('td span a[href^="mailto"]').textContent,
site: tr.querySelector('td span a:not([href^="mailto"])').textContent
};
});
我实际上是在尝试从 CasperJs 的网站获取一些数据。数据存储在 table 中。 我试图在报废后获得一个合适的 JSON 文件。一个 json 与: - 公司的名称, - 邮件, - 网站 - activity 的描述。
到目前为止,我已经能够打开页面并获取数据,但不是很准确(邮件和网站在同一个上)。所以我找到了如何精确地 select 每个我想要的元素。 但在这种情况下,我没有得到所有 table 信息,只有第一行...
我想知道是否有人可以帮助我,告诉我在哪里看或如何在我的情况下进行循环?假设我不是专业开发人员,我正在训练自己。
这是我的代码:
var casper = require('casper').create();
var url = 'http://www.rent2016.fr/pages/exposants';
var fs = require('fs');
var length;
casper.start(url);
casper.then(function() {
this.waitForSelector('table#myTable');
});
casper.then(function(){
var info = this.evaluate(function(){
var table_rows = document.querySelectorAll("tr"); //or better selector
return Array.prototype.map.call(table_rows, function(tr){
return {
nom : document.querySelector(".td-width h3").textContent,
description: document.querySelector(".td-width p").textContent,
mail : document.querySelector("td span a").textContent,
site : document.querySelector('td span a[href^="http"]').textContent,
};
});
});
fs.write('test_rent_stringify.json', JSON.stringify(info), 'w');
this.echo(JSON.stringify(info, undefined, 4));
});
casper.run(function() {
});
在这里,我们没有循环:JSON 重复第一行信息。要获取您必须替换的每一行信息
nom : document.querySelector(".td-width h3").textContent,
来自
nom : tr.children[1].textContent,
但在这种情况下,您无法精确定位 H3、链接……您可以获得所有信息。所以实际上我可以:
遍历行并获取信息,但它们不可用
只有第一行的信息,但表现很好
提前致谢!
为了获取每个元素内部的信息,您必须使用 tr.querySelector 而不是 document.querySelector。
以下循环适用于页面:
var table_rows = document.querySelectorAll("tbody tr"); //or better selector
return Array.prototype.map.call(table_rows, function(tr) {
return {
nom: tr.querySelector(".td-width h3").textContent,
description: tr.querySelector(".td-width p").textContent,
mail: tr.querySelector('td span a[href^="mailto"]').textContent,
site: tr.querySelector('td span a:not([href^="mailto"])').textContent
};
});