javascript - Puppeteer 始终未定义,但 devtools 适用于嵌套 Node 列表

标签 javascript node.js dom web-scraping puppeteer

我是 Puppeteer 的新手,不太确定我在这里做错了什么,但在 DevTools 中,我得到了正确的输出。但是,我希望创建一个包含这些值的文件,但不断出现未定义

我认为这与 Node 列表有关并且无法返回它们,但我不知道如何修复它。

这在 DevTools 中有效:

let arr2 = Array.from(document.querySelectorAll(
  "#data > div.data-wrapper > div > div > table > tbody  tr"))
.map(row => (
  {site:row.querySelector('td:nth- child(2)').innerText,
  pass:row.querySelector('td:nth- child(10)').innerText,
  user:row.querySelector('td:nth-child(9)').innerText
  }))
  //with a console.log()

我还尝试了 row.evaluate(()=>) ,但它对我不起作用。

这是我的代码不起作用:

(async () => {
  const browser = await puppeteer.launch({ headless: false });
  const page = await browser.newPage();
    await page.authenticate({ username: "username", password: "password" });
    await page.goto("https://website/.../all");
    await page.waitFor(120000); // beacuse It loads everything slowly and times out the default 30000

    console.log("started evalating");
    var data = await page.evaluate(() => {
      Array.from(
        document.querySelectorAll(
          "#data > div.data-wrapper > div > div > table > tbody  tr"
        )
      ).map(row => {
        return {
          site: row.querySelector("td:nth-child(2)").innerText,
          pass: row.querySelector("td:nth-child(10)").innerText,
          user: row.querySelector("td:nth-child(9)").innerText
        };
      });
    });
  console.log(data);
})();

//I want an array of objects but the result throws errors or comes back with [undefined,......]

最佳答案

页面函数传递给page.evaluate()缺少 return语句,因此不返回值。因此,变量 dataundefined .

您应该注意两个额外的细节:

  1. Array.from()有一个内置map功能。

    Array.from(arrayLike, mapFn)     // good
    Array.from(arrayLike).map(mapFn) // bad
    
  2. 您应该使用letconst而不是var只要有可能。

    let data = ... // good
    var data = ... // bad
    

这是您的代码的修订版,应该可以正常工作:

'use strict';

const puppeteer = require('puppeteer');

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

  const page = await browser.newPage();

  await page.authenticate({
    username: 'username',
    password: 'password',
  });

  await page.goto('https://website/.../all');

  await page.waitFor(120000);

  console.log('started evalating');

  let data = await page.evaluate(() => {
    return Array.from(
      document.querySelectorAll('#data > div.data-wrapper > div > div > table > tbody tr'),
      row => ({
        site: row.querySelector('td:nth-child(2)').innerText,
        pass: row.querySelector('td:nth-child(10)').innerText,
        user: row.querySelector('td:nth-child(9)').innerText,
      })
    );
  });

  console.log(data);
})();

关于javascript - Puppeteer 始终未定义,但 devtools 适用于嵌套 Node 列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53126704/

相关文章:

javascript - 为什么使用 setInterval 时似乎将两个值设置为单个变量?

javascript - Jquery - Internet Explorer - 语法错误

javascript - Webdriver.io pageObject 模式 - 通过传递参数定义元素选择器

javascript - 获取执行 node.js 的目录

java - Android - Node.getNodeValue() 在存在 ' 时被截断

php - 获取Facebook当前位置和公开资料的家乡

node.js - passport.js - facebook 策略注销问题

json - 为什么我的 req.flash 不起作用?

php - 查找包含域的 href 的特定 getElementsByTagName ('a' )

javascript - 使用 DOM 样式通过 Javascript 获取或更改 CSS 类属性