【问题标题】:Pass variable into page.evaluate将变量传递到 page.evaluate
【发布时间】:2021-08-22 17:01:33
【问题描述】:

我已经搜索过传递变量,但没有成功。它返回未定义的“数据”。请帮我解决这个问题!

const details = (
      await Promise.allSettled(
        datas
          .map(async (data) => {
            const page = await browser.newPage();

            await page.goto(data.link, {
              waitUntil: "networkidle2",
            });
            return await page.evaluate((data) => {
              return {
                regular_price: document.querySelector(data.regular_price_class)
                  ? document.querySelector(data.regular_price_class).innerText.replace(/[\$,\D]/g, "")
                  : "",
                sale_price: document.querySelector(data.sale_price_class)
                  ? document.querySelector(data.sale_price_class).innerText.replace(/[\$,\D]/g, "")
                  : "",
                online_sale_price: document.querySelector(data.online_sale_price_class)
                  ? document.querySelector(data.online_sale_price_class).innerText.replace(/[\$,\D]/g, "")
                  : "",
                promotion: document.querySelector(data.promotion_class)
                  ? document.querySelector(data.promotion_class).innerText.replace(/[\$,\D]/g, "")
                  : "",
              };
            });
          }, data)
      )
    )

【问题讨论】:

    标签: javascript async-await promise puppeteer


    【解决方案1】:

    现在,您将 data 作为第二个参数传递给 .map,这没有任何意义:

    const details = (
        await Promise.allSettled(
          datas
            .map(async (data) => {
              // ...
            }, data)
        )
      )
    

    相反,您需要将其传递给page.evaluate

    const details = (
        await Promise.allSettled(
          datas
            .map(async (data) => {
              const page = await browser.newPage();
    
              await page.goto(data.link, {
                waitUntil: "networkidle2",
              });
              return await page.evaluate((data) => {
                return {
                  // ...
                };
              }, data);
            })
        )
      )
    

    我还推荐一个提取价格的函数,让事情变得更加干燥:

    return page.evaluate((data) => {
        const getPrice = selector => (document.querySelector(selector)?.innerText || '').replace(/[\$,\D]/g, "");
      return {
          regular_price: getPrice(data.regular_price_class),
          sale_price: getPrice(data.sale_price_class),
          online_sale_price: getPrice(data.online_sale_price_class),
          promotion: getPrice(data.promotion_class),
      };
    }, data);
    

    【讨论】:

    • 非常感谢。这花了我昨天的时间。我的错!
    猜你喜欢
    • 1970-01-01
    • 2018-04-02
    • 1970-01-01
    • 2018-03-20
    • 1970-01-01
    • 2020-03-13
    • 2018-06-02
    • 2018-03-23
    • 2014-01-22
    相关资源
    最近更新 更多