【问题标题】:Code working on DevTools but not working inside page.evaluate()在 DevTools 上工作但在 page.evaluate() 内不工作的代码
【发布时间】:2020-08-11 20:15:24
【问题描述】:

我对 javascript 和 Puppeteer 也很陌生。

我正在尝试从论坛内的一系列网页中获取一些 innerHTML。页面的 URL 遵循具有前缀和末尾“/page-N”的模式,N 是页码。

所以我决定使用 for 循环和模板字面量遍历页面,在每个循环中加载一个新的页面 URL,直到达到最终的页面数,包含在变量 C.numberOfPages 中。

问题是:page.evaluate() 函数内的代码不起作用,当我运行我的代码时,我得到 TypeError: Cannot read property of undefined。我已经检查过,问题的根源是 document.getElementById('discussion_subentries') 返回未定义。

我已经测试了 Chrome 开发工具中 page.evaluate() 函数内部的相同代码,它运行良好,返回了我想要的 innerHTML。由于我正在抓取的页面结构,所有这些 .children[] 连接都是必需的,并且它们在浏览器上运行良好,返回正确的值。

那么如何让它在我的 Puppeteer 脚本中工作?

for (let i = 1; i <= C.numberOfPages; i++) {
      let URL = `${C.url}page-${i}`;
      await page.goto(URL);
      await page.waitForSelector('#discussion_subentries');

      let pageData = await page.evaluate(() => {
        let discussionEntries = document.getElementById('discussion_subentries')
          .children[1];

        let discussionEntryMessages = [];
        for (let j = 0; j < discussionEntries.childElementCount; j++) {
          let thisEntryMessage =
            discussionEntries.children[j].children[0].children[1].children[1]
              .children[1].innerHTML;
          discussionEntryMessages.push(thisEntryMessage);
        }

        return discussionEntryMessages;
      });

      entryData.discussionEntryMessages.push(pageData);
    }

【问题讨论】:

    标签: javascript node.js puppeteer


    【解决方案1】:

    页面评估不是问题,它可以 100% 用作开发工具。问题很可能是等待选择器没有完成正确的工作,并且没有等待元素正确加载,然后再进一步。尝试通过添加一些睡眠而不是等待选择器来进行调试,以确认这是问题所在。

    【讨论】:

    • 我尝试了很多方法来确保页面已加载,所有方法都返回相同的错误。最后一次尝试使用 page.waitFor(20000) 只是为了确定,但得到了同样的错误。
    猜你喜欢
    • 2012-12-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-10
    • 2015-11-06
    • 2019-04-20
    • 2017-06-05
    • 1970-01-01
    • 2013-03-13
    相关资源
    最近更新 更多