puppeteer page.evaluate() returns 空对象

puppeteer page.evaluate() returns empty object

我正在尝试抓取此网站 https://poe.ninja/challenge/builds?time-machine=day-6 using Puppeteer. I tried 并在此处看到很多类似的问题。但是 none 解决了我的问题。

这是我的代码:

const scrapeNinja = async () => {
    const browser = await puppeteer.launch({headless: false})

    const page = await browser.newPage()

    await page.goto(`https://poe.ninja/challenge/builds?time-machine=day-6`, {
        waitUntil: 'domcontentloaded',
    })

    const getArray = await page.evaluate(() => {
        return Array.from(document.querySelectorAll(
                '#openSidebar > div > section:nth-child(3) > div > div > div > ul li .css-1h2ruwl'
            )).map(e => e.textContent)
    })

    console.log(getArray)
}

我知道 return 从 page.evaluate 编辑的值应该是可序列化的。这 Array.from(document.querySelectorAll('#openSidebar > div > section:nth-child(3) > div > div > div > ul li .css-1h2ruwl')).map(e => e.textContent) 不是可序列化的值吗?我尝试在开发工具部分使用它 return exacully 我想要什么,但回到 node.js,它只是 return 空数组...

我是不是做错了什么?

看来问题确实出在等待上,即使 dom 内容尚未完全加载,您仍在寻找元素。

  const scrapeNinja = async () => {
  const browser = await puppeteer.launch({headless: false})

  const page = await browser.newPage()

  await page.goto(`https://poe.ninja/challenge/builds?time-machine=day-6`, {
    waitUntil: 'networkidle2',
  })
  

  const getArray = await page.$$eval('#openSidebar > div > section:nth-child(3) > div > div > div > ul li .css-1h2ruwl',
    el => el.map(item => item.textContent))

  console.log(getArray)
}

scrapeNinja()

这段代码非常适合我,即使您不必初始化数组。将来在 waitUntil 选项

中使用 networkidle2