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