Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在运行结束时导出到CSV_Javascript_While Loop_Puppeteer_Export To Csv_Do While - Fatal编程技术网

Javascript 在运行结束时导出到CSV

Javascript 在运行结束时导出到CSV,javascript,while-loop,puppeteer,export-to-csv,do-while,Javascript,While Loop,Puppeteer,Export To Csv,Do While,刮取第一页数据的原始代码可以工作,但我创建了一个循环,单击“加载更多”按钮,然后刮取数据,直到没有更多的“加载更多”按钮。在我的跑步结束时,它没有输出任何东西。我导出到CSV的代码是否不正确?这件事我哪里做错了 const puppeteer = require('puppeteer'); const jsonexport = require('jsonexport'); (async () => { const browser = await puppeteer.launch({

刮取第一页数据的原始代码可以工作,但我创建了一个循环,单击“加载更多”按钮,然后刮取数据,直到没有更多的“加载更多”按钮。在我的跑步结束时,它没有输出任何东西。我导出到CSV的代码是否不正确?这件事我哪里做错了

const puppeteer = require('puppeteer');
const jsonexport = require('jsonexport');

(async () => {
  const browser = await puppeteer.launch({ headless: false }); // default is true
  const page = await browser.newPage();
  await page.goto('https://www.Website.com/exercises/finder', {
    waitUntil: 'domcontentloaded',
  });

  //load more CSS to be targeted
  const LoadMoreButton =
    '#js-ex-content > #js-ex-category-body > .ExCategory-results > .ExLoadMore > .bb-flat-btn';

  do {
// clicking load more button and waiting 1sec
    await page.click(LoadMoreButton);
    await page.waitFor(1000);

    const loadMore = true;


    const rowsCounts = await page.$eval(
      '.ExCategory-results > .ExResult-row',
      (rows) => rows.length
    );

    //scraping the data
    const exerciseNames = [];
    for (let i = 2; i < rowsCounts + 1; i++) {
      const exerciseName = await page.$eval(
        `.ExCategory-results > .ExResult-row:nth-child(${i}) > .ExResult-cell > .ExHeading > a`,
        (el) => el.innerText
      );
      exerciseNames.push(exerciseName);
    }

    console.log({exerciseNames});
  } while (10000);

  const allData = [
    {
      exercise: exerciseNames,
    },
  ];
// exporting data to CSV
  const options = [exercise];
  //json export error part
  jsonexport(allData, options, function (err, csv) {
    if (err) return console.error(err);
    console.log(csv);
  });

  await browser.close();
})().catch((e) => {
  console.error(e);
});

编辑2 这是我目前的全部代码。它正在输出allData预填充信息,但不再输出新数据

 const puppeteer = require('puppeteer');
const jsonexport = require('jsonexport');
const fs = require('fs');

(async () => {
  const browser = await puppeteer.launch({ headless: false }); // default is true
  const page = await browser.newPage();
  await page.goto('https://www.website.com/exercises/finder', {
    waitUntil: 'domcontentloaded',
  });

  const loadMore = true;

  const rowsCounts = await page.$$eval(
    '.ExCategory-results > .ExResult-row',
    (rows) => rows.length
  );
  let allData = [];
  for (let i = 2; i < rowsCounts + 1; i++) {
    const exerciseName = await page.$eval(
      `.ExCategory-results > .ExResult-row:nth-child(${i}) > .ExResult-cell > .ExHeading > a`,
      (el) => el.innerText
    );
    const muscleGroupName = await page.$eval(
      `.ExCategory-results > .ExResult-row:nth-child(${i}) > .ExResult-cell > .ExResult-muscleTargeted > a`,
      (el) => el.innerHTML
    );
    const equipmentName = await page.$eval(
      `.ExCategory-results > .ExResult-row:nth-child(${i}) > .ExResult-cell > .ExResult-equipmentType > a`,
      (el) => el.innerHTML
    );

    let obj = {
      exercise: exerciseName,
      muscleGroup: muscleGroupName,
      equipment: equipmentName,
    };
    allData.push(obj);
  }
  console.log(allData);

  async function fn() {
    const allData = [
      {
        exercise: 'Rickshaw Carry',
        muscleGroup: 'Forearms',
        equipment: 'Other',
      },
      {
        exercise: 'Single-Leg Press',
        muscleGroup: 'Quadriceps',
        equipment: 'Machine',
      },
      {
        exercise: 'Landmine twist',
        muscleGroup: 'Forearms',
        equipment: 'Other',
      },
      {
        exercise: 'Weighted pull-up',
        muscleGroup: 'Forearms',
        equipment: 'Other',
      },
    ];

    // json export error part
    jsonexport(allData, function (err, csv) {
      if (err) return console.error(err);
      console.log(csv);
      fs.writeFileSync('output.csv', csv);
    });
  }
  fn();

  await browser.close();
})().catch((e) => {
  console.error(e);
});
const puppeter=require('puppeter');
const jsonexport=require('jsonexport');
常数fs=要求('fs');
(异步()=>{
const browser=wait puppeter.launch({headless:false});//默认值为true
const page=wait browser.newPage();
等待页面。转到('https://www.website.com/exercises/finder', {
waitUntil:'domcontentloaded',
});
const loadMore=true;
const rowsconts=等待页面。$$eval(
“.ExCategory results>.ExResult行”,
(行)=>rows.length
);
让allData=[];
for(设i=2;i.ExResult行:第n个子(${i})>.ExResult单元格>.ExHeading>a`,
(el)=>el.innerText
);
const muscleGroupName=等待页面。$eval(
`.ExCategory results>.ExResult行:第n个子(${i})>.ExResult单元格>.ExResult muscleTargeted>a`,
(el)=>el.innerHTML
);
const equipmentName=等待页面。$eval(
`.ExCategory results>.ExResult行:第n个子(${i})>.ExResult单元格>.ExResult设备类型>a`,
(el)=>el.innerHTML
);
设obj={
练习:练习名称,
muscleGroup:muscleGroup名称,
设备:设备名称,
};
allData.push(obj);
}
console.log(allData);
异步函数fn(){
常数allData=[
{
练习:"人力车",,
肌肉群:“前臂”,
设备:“其他”,
},
{
练习:“单腿按压”,
肌肉群:“股四头肌”,
设备:“机器”,
},
{
练习:“地雷扭曲”,
肌肉群:“前臂”,
设备:“其他”,
},
{
练习:“负重引体向上”,
肌肉群:“前臂”,
设备:“其他”,
},
];
//json导出错误部分
jsonexport(所有数据,函数(err,csv){
if(err)返回控制台。error(err);
console.log(csv);
fs.writeFileSync('output.csv',csv);
});
}
fn();
等待浏览器关闭();
})()捕获((e)=>{
控制台错误(e);
});
我在这里看到两个问题

I.)其中一个带有
选项
声明:

const options = [exercise]; // ❌
您试图访问
allData
对象的
exercise
属性,但没有正确的符号。如果确实需要在新数组中提取它,可以使用index
[0]
进入
allData
数组的第一个元素,然后使用访问
练习
属性

const options = [allData[0].exercise]; // ✅
注意:我建议只保留选项
allData[0]。练习
(不使用换行数组),因为
allData
对象已经是一个数组了,我看不到使结构更深的好处


第二个问题是npm包的使用。我想您意外地将
allData
留在了这一行:

jsonexport(allData, options, function (err, csv) // ❌
您只需要此处的
选项
(根据,您只能提供一个对象作为输入):


编辑 根据更新的答案,如果稍微重新构造
allData
对象,那么问题就可以得到解决,因此jsonexport将正确识别每一列和每一行

const jsonexport=require('jsonexport')
常量fs=require('fs')
异步函数fn(){
常数allData=[
{
练习:"人力车",,
肌肉群:“前臂”,
设备:“其他”
},
{
练习:“单腿按压”,
肌肉群:“股四头肌”,
设备:“机器”
},
{
练习:“地雷扭曲”,
肌肉群:“前臂”,
设备:“其他”
},
{
练习:“负重引体向上”,
肌肉群:“前臂”,
设备:“其他”
}
]
//json导出错误部分
jsonexport(所有数据,函数(err,csv){
如果(错误)返回控制台。错误(错误)
console.log(csv)
fs.writeFileSync('output.csv',csv)
})
}
fn()
要实现这样的结构,您应该在每次迭代中扩展
所有数据
,如下所示:

let allData=[]
for(设i=2;iel.textContent.trim()
const muscleGroupName=wait page.$eval(`……行:第n个子(${i}))…`,
el=>el.textContent.trim()
const equipmentName=wait page.$eval(`…行:第n个子(${i}))…`,
el=>el.textContent.trim()
设obj={
练习:练习名称,
muscleGroup:muscleGroup名称,
设备:设备名称
}
allData.push(obj)
}
console.log(所有数据)

我们需要更多信息。到底发生了什么?代码是否记录了错误?突出的一行是“const options=[exercise];“什么是exercise?”?你好像没有申报。正如一个疯狂的建议,您可以尝试删除options参数,因为它似乎没有必要,而且可能会导致问题。虽然是IDK。对于选项,我认为这是因为它会导出一个列练习,而每一行都是exerciseNames。我也不明白它如何将其导出为CSV文件。但在研究了更多内容之后,我是否需要导入fs以便创建CSV文件?对所有的问题我都很抱歉,我对这个问题还不熟悉,而且很困惑。和往常一样,谢谢你的帮助。我花了一整天的时间想弄明白,但现在我真的被卡住了。我更新了网站并发布了我用于导出的当前代码。让我们一起来。嗨@Br
jsonexport(allData, options, function (err, csv) // ❌
jsonexport(options, function (err, csv) // ✅