如何与操纵up一起使用for循环

问题描述 投票:0回答:1

我正在从Facebook Marketplace抓取数据。我想做的是使用puppeteer来:1)创建我所有列表名称的节点列表2)使用for循环单击列表名称以弹出更多信息3)从弹出窗口中刮取数据并将其保存到数组中4)关闭弹出窗口5)对每个列表重复此过程以返回数组数据

这是我目前无法使用的代码:

const postClick = async (page) => {
      await page.evaluate(() => {
//Capture the nodelist of listing names
            let buttons = document.querySelectorAll('#marketplace-modal-dialog-title');
//If the nodelist of listings exist 
            if(buttons.length) {
//Loop through all listing names
              for(let i = 0; i < buttons.length; i++) {
                let button = buttons[i];
//click the listing
                button.click();
//wait for the X button to appear
                async (page) => {
                  await page.waitForSelector("button._3-9a._50zy._50-1._50z_._5upp._42ft");
                  await page.waitFor(5000)
                  await page.evaluate(() =>{
//click the X button
                  document.querySelector('button._3-9a._50zy._50-1._50z_._5upp._42ft').click();            
                });
                }
              }

            }
          });
        }

然后我在浏览器关闭此处之前立即致电:

await postClick(page);

我没有收到错误,但代码未运行。一旦我取出for循环,并让button = button [0];该代码仅适用于第一项。

javascript node.js puppeteer
1个回答
0
投票

#marketplace-modal-dialog-title通过id捕获元素建议页面中仅存在1个项目,因为id应该是唯一的...我不知道为什么脸书有多个具有相同id的元素,但也许木偶对此做出了反应,仅捕获了1个元素

尝试按类别捕获按钮

let buttons = await page.$$('._50f4._50f7');

或与此等价的document.querySelectorAll等价物>

buttons.length返回的数字是if(buttons.length),即您要检查的是true还是false,而不是数字,因此它应该是if(buttons.length > 0),尽管某些语言认为0为假,但这有效,但不能一个好主意

© www.soinside.com 2019 - 2024. All rights reserved.