2015-04-05 43 views
1

我正在研究一个项目,在这个项目中循环访问一系列发票并从每张发票中提取数据表。我正在使用CasperJS编写代码,并且已经达到了可以将所有相关信息删除并将其存储在一个数组中的程度,但是无法将信息输出到结构化的Excel中。CasperJS:将刮取的数据导出到结构化的Excel或CSV

代码工作现在的方法如下:
1)捕获每张发票
2的URL)贯穿于各个环节的循环和捕捉如发票号码,发票日期,每个购买的产品名称关键信息,以及每件产品的价格。

这里是在这部分代码看起来像:

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美元。我想把这个数据看起来像这样的表:

发票号码发票日期描述价格
1 2015年1月1日产品X $ 1
1 2015年1月1日产品Y $ 2
1月2日2 2015年产品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 w应与多种描述和价格相关联,并且我想确保维持这种关系(如表中所示)。谢谢!!

+0

后来在感谢抬起头来!我已更新该帖子;希望它现在更有意义 – 2015-04-05 18:16:06

回答

0

问题是,您不能映射到当前阵列的最终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); 
}); 
+0

如果描述包含换行符或类似的东西,你可能需要调整它。 – 2015-04-05 20:27:42