Node.js中如何将对象转为数组?适配objects-to-csv问题
解决objects-to-csv需要传入对象数组的问题
你遇到的问题很清晰:saveDataToCsv最后接收的result只是循环最后一次返回的单个对象,而objects-to-csv库要求传入对象数组,这就是命令提示符报错的原因。
修改步骤:
- 先初始化一个空数组,用来存储所有爬取到的结果,避免每次循环覆盖单个变量
- 循环过程中,把每次爬取到的对象
push进这个数组 - 最后将完整的数组传入
saveDataToCsv函数
修改后的完整代码如下:
const ObjectsToCsv = require("objects-to-csv"); async function scrapeDescription(url, page) { //more code ... return {url, cats, main_img, name, descript, price}; } async function saveDataToCsv(data) { const csv = new ObjectsToCsv(data); await csv.toDisk("spreadsheets/output.csv"); } browser = await puppeteer.launch({ headless: false}); const descriptionPage = await browser.newPage(); // 初始化空数组存储所有爬取结果 const resultsArray = []; for (var i=0; i< 2; i++){ const result = await scrapeDescription(scrapeResults[i], descriptionPage); console.log(result); // 将单条结果加入数组 resultsArray.push(result); } // 传入对象数组而非单个对象 await saveDataToCsv(resultsArray);
为什么这样修改有效?
- 原来的代码中,
result变量在每次循环迭代时都会被新对象覆盖,循环结束后它只保留了最后一次爬取的数据 objects-to-csv的构造函数需要接收对象数组,这样才能把数组里的每个对象映射为CSV文件的一行数据
这样调整后,所有爬取到的商品数据都会被收集到数组中,再传给CSV库就能正确生成包含全部内容的CSV文件了。
内容的提问来源于stack exchange,提问作者Maureen Moore
相关产品推荐
相关产品推荐

