【问题标题】:Puppeteer's page.evaluate does not consider i in for loop [duplicate]Puppeteer 的 page.evaluate 不考虑 i 在 for 循环中[重复]
【发布时间】:2021-01-17 08:11:08
【问题描述】:

我一直在尝试遍历一个 div 列表,除了其中显示的数据之外几乎相同,它们位于 dom 的某个部分 <aside> 下,以便从每个部分中获取 innerText .结果在硬编码nth-child 数字时正常运行,但是,尝试在 for 循环中对其进行迭代会产生错误:Error: Evaluation failed: ReferenceError: i is not defined at __puppeteer_evaluation_script__:1:130。对这里发生的事情感到困惑。

    for (let i = 1; i < 9; i++) {
        let info = await page.evaluate(
            () => [...document.querySelectorAll(`#root > main > div.sc-jcVebW.eVwwrC > div.sc-bZSQDF.dgraCx > div > aside > div:nth-child(${i}) > div.sc-dlfnbm.ujoHC > div.sc-hKgILt.beOqPu > div > h2`)].map(elem => elem.innerText)
        );
        console.log(info)
    }

【问题讨论】:

    标签: javascript node.js puppeteer


    【解决方案1】:

    传递给page.evaluate 的函数会被字符串化,以便它们可以在浏览器中运行,因此它们没有通常期望的词法范围继承。您需要将另一个参数传递给page.evaluate 以指示函数应采用的参数。

    我还建议使代码更具可读性:将长选择器放在自己的行上,并使用const 而不是let(如果可能的话):

    const info = await page.evaluate(
        (i) => {
            const selector = `#root > main > div.sc-jcVebW.eVwwrC > div.sc-bZSQDF.dgraCx > div > aside > div:nth-child(${i}) > div.sc-dlfnbm.ujoHC > div.sc-hKgILt.beOqPu > div > h2`;
            return [...document.querySelectorAll(selector)]
               .map(elem => elem.innerText);
        },
        i
    );
    

    还要考虑 .innerText 是否真的是您需要的 - it usually isn't。如果可以,请改用.textContent

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-28
      • 2013-04-26
      • 2019-06-01
      • 2021-10-31
      • 1970-01-01
      • 2020-05-03
      • 2011-05-14
      相关资源
      最近更新 更多