CasperJS:将抓取的数据导出到结构化 Excel 或 CSV
CasperJS: Export scraped data to structured Excel or CSV
我正在开展一个项目,我正在循环处理一系列发票并从每张发票中抓取 table 数据。我正在用 CasperJS 编写代码,并且已经达到了可以抓取所有相关信息并将其存储在数组中的程度,但是无法将信息输出到结构化 Excel.
代码现在的工作方式如下:
1) 捕获每张发票的 URL
2) 遍历每个 link 并捕获重要信息,例如发票编号、发票日期、购买的每个产品的名称以及购买的每个产品的价格。
这部分代码如下所示:
function getDescriptions() {
var description = document.querySelectorAll('#InvoiceDetailGrid tbody tr td:nth-child(3)');
return Array.prototype.map.call(description, function(elem) {
return elem.textContent;
});
}
function getPrices() {
var price = document.querySelectorAll('#InvoiceDetailGrid tbody tr td:nth-child(4)');
return Array.prototype.map.call(price, function(elem) {
return elem.textContent;
});
}
casper.then(function() {
for(var z = 0; z < 5; z++) {
casper.thenOpen(baseURL + links[z]);
this.wait(2000, function() {
invoiceNumber = invoiceNumber.concat(this.fetchText('#InvoiceNumber'));
invoiceDate = invoiceDate.concat(this.fetchText(x('//*[@id="printArea"]/table/tbody/tr[1]/td/table/tbody/tr/td[1]/table/tbody/tr[2]/td[2]')));
description = description.concat(this.evaluate(getDescriptions));
price = price.concat(this.evaluate(getPrices));
});
}
});
输出是正确的,看起来像这样:invoiceNumber = 1, 2, 3; invoiceDate = 2015 年 1 月 1 日,2015 年 1 月 2 日,2015 年 1 月 3 日;描述 = 产品 X、产品 Y、产品 X、产品 Z、产品 A、产品 B、产品 C;价格 = 1 美元、2 美元、1 美元、3 美元、4 美元、5 美元、10 美元。我想将这些数据放在 table 中,如下所示:
发票编号发票日期描述价格
1 2015 年 1 月 1 日产品 X 1 美元
1 2015 年 1 月 1 日产品 Y $2
2 2015 年 1 月 2 日产品 X $1
2 2015 年 1 月 2 日产品 Z $3
3 2015 年 1 月 3 日产品 A $4
3 2015 年 1 月 3 日产品 B $5
3 2015 年 1 月 3 日产品 C $10
每个 invoiceNumber 和 invoiceDate 都与多个描述和价格相关联,我想确保保持这种关系(如 table 中所示)。谢谢!!
问题是您无法从当前数组映射到最终的 csv table,因为价格多于发票编号。
您可以直接将数据写入文件:
var sep = ";";
var fs = require('fs');
this.wait(2000, function() {
var invoiceNumber = this.fetchText('#InvoiceNumber');
var invoiceDate = this.fetchText(x('//*[@id="printArea"]/table/tbody/tr[1]/td/table/tbody/tr/td[1]/table/tbody/tr[2]/td[2]'));
var description = this.evaluate(getDescriptions);
var price = this.evaluate(getPrices);
for(var i = 0; i < description.length; i++) {
// assume description and price have the same length
// append line:
fs.write("invoices.csv", invoiceNumber+sep+invoiceDate+sep+description[i]+sep+price[i]+"\n", "a");
}
});
或者将所有内容保存到数组中以便稍后对其进行迭代
var invoices = [];
this.wait(2000, function() {
var invoice = {};
invoice.number = this.fetchText('#InvoiceNumber');
invoice.date = this.fetchText(x('//*[@id="printArea"]/table/tbody/tr[1]/td/table/tbody/tr/td[1]/table/tbody/tr[2]/td[2]'));
invoice.descriptions = this.evaluate(getDescriptions);
invoice.prices = this.evaluate(getPrices);
invoices.push(invoice);
});
我正在开展一个项目,我正在循环处理一系列发票并从每张发票中抓取 table 数据。我正在用 CasperJS 编写代码,并且已经达到了可以抓取所有相关信息并将其存储在数组中的程度,但是无法将信息输出到结构化 Excel.
代码现在的工作方式如下:
1) 捕获每张发票的 URL
2) 遍历每个 link 并捕获重要信息,例如发票编号、发票日期、购买的每个产品的名称以及购买的每个产品的价格。
这部分代码如下所示:
function getDescriptions() {
var description = document.querySelectorAll('#InvoiceDetailGrid tbody tr td:nth-child(3)');
return Array.prototype.map.call(description, function(elem) {
return elem.textContent;
});
}
function getPrices() {
var price = document.querySelectorAll('#InvoiceDetailGrid tbody tr td:nth-child(4)');
return Array.prototype.map.call(price, function(elem) {
return elem.textContent;
});
}
casper.then(function() {
for(var z = 0; z < 5; z++) {
casper.thenOpen(baseURL + links[z]);
this.wait(2000, function() {
invoiceNumber = invoiceNumber.concat(this.fetchText('#InvoiceNumber'));
invoiceDate = invoiceDate.concat(this.fetchText(x('//*[@id="printArea"]/table/tbody/tr[1]/td/table/tbody/tr/td[1]/table/tbody/tr[2]/td[2]')));
description = description.concat(this.evaluate(getDescriptions));
price = price.concat(this.evaluate(getPrices));
});
}
});
输出是正确的,看起来像这样:invoiceNumber = 1, 2, 3; invoiceDate = 2015 年 1 月 1 日,2015 年 1 月 2 日,2015 年 1 月 3 日;描述 = 产品 X、产品 Y、产品 X、产品 Z、产品 A、产品 B、产品 C;价格 = 1 美元、2 美元、1 美元、3 美元、4 美元、5 美元、10 美元。我想将这些数据放在 table 中,如下所示:
发票编号发票日期描述价格
1 2015 年 1 月 1 日产品 X 1 美元
1 2015 年 1 月 1 日产品 Y $2
2 2015 年 1 月 2 日产品 X $1
2 2015 年 1 月 2 日产品 Z $3
3 2015 年 1 月 3 日产品 A $4
3 2015 年 1 月 3 日产品 B $5
3 2015 年 1 月 3 日产品 C $10
每个 invoiceNumber 和 invoiceDate 都与多个描述和价格相关联,我想确保保持这种关系(如 table 中所示)。谢谢!!
问题是您无法从当前数组映射到最终的 csv table,因为价格多于发票编号。
您可以直接将数据写入文件:
var sep = ";";
var fs = require('fs');
this.wait(2000, function() {
var invoiceNumber = this.fetchText('#InvoiceNumber');
var invoiceDate = this.fetchText(x('//*[@id="printArea"]/table/tbody/tr[1]/td/table/tbody/tr/td[1]/table/tbody/tr[2]/td[2]'));
var description = this.evaluate(getDescriptions);
var price = this.evaluate(getPrices);
for(var i = 0; i < description.length; i++) {
// assume description and price have the same length
// append line:
fs.write("invoices.csv", invoiceNumber+sep+invoiceDate+sep+description[i]+sep+price[i]+"\n", "a");
}
});
或者将所有内容保存到数组中以便稍后对其进行迭代
var invoices = [];
this.wait(2000, function() {
var invoice = {};
invoice.number = this.fetchText('#InvoiceNumber');
invoice.date = this.fetchText(x('//*[@id="printArea"]/table/tbody/tr[1]/td/table/tbody/tr/td[1]/table/tbody/tr[2]/td[2]'));
invoice.descriptions = this.evaluate(getDescriptions);
invoice.prices = this.evaluate(getPrices);
invoices.push(invoice);
});