CasperJS:将已删除的数据导出为结构化Excel或CSV

时间:2015-04-05 15:31:23

标签: javascript csv web-scraping phantomjs casperjs

我正在开展一个项目,我正在循环查看一系列发票并从每张发票中抓取一张数据表。我在CasperJS中编写代码,并且已经达到了我可以抓取所有相关信息并将其存储在数组中的程度,但是在将信息输出到结构化Excel中时遇到了问题。

现在代码的工作方式如下:
1)捕获每张发票的URL 2)循环浏览每个链接并捕获关键信息,例如发票编号,发票日期,购买的每种产品的名称以及购买的每种产品的价格。

以下是代码的这一部分:

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美元。我想将这些数据放在一个如下所示的表中:

发票编号发票日期说明价格
2015年1月1日产品X $ 1
2015年1月1日产品Y $ 2
2015年1月2日产品X $ 1
2015年1月2日产品Z $ 3
2015年1月3日产品A $ 4
2015年1月3日产品B $ 5
2015年1月3日产品C $ 10

每个invoiceNumber和invoiceDate都会与多个描述和价格相关联,我希望确保维持关系(如表中所示)。谢谢!

1 个答案:

答案 0 :(得分:1)

问题在于您无法从当前阵列映射到最终的csv表,因为价格高于发票号。

您可以直接将数据写入文件:

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