【问题标题】:Why I can't push data into an array inside block page.evaluate puppeteer crawler?为什么我不能将数据推送到块 page.evaluate puppeteer crawler 内的数组中?
【发布时间】:2020-09-21 01:24:23
【问题描述】:
var codes = [];    
await page.evaluate((codes) => {
    $(".offers-details").each(function (i, e) {
        if ($(e).find('.coupon-code').length > 0) {
            console.log($(e).find('.coupon-code .btn-copy').attr('data-clipboard-text'));
            codes.push($(e).find('.coupon-code .btn-copy').attr('data-clipboard-text'));
        }
    });
}, codes);

如何在handlePageFunction 中在page.evaluate() 之外使用jQuery? 我只想在这里使用 jQuery。
当我在handlePageFunction 中使用它时它不起作用。 如何解决?

【问题讨论】:

    标签: apify


    【解决方案1】:

    page.evaluate 是一个在浏览器内部执行的 Puppeteer 函数,这就是您访问全局 $ 变量(附加到 window 变量)的方式。

    虽然您不能在浏览器之外使用 jQuery,但您可以使用 Puppeteer 中的所有选择器功能:https://pptr.dev/#?product=Puppeteer&version=v5.2.1&show=api-pageselector

    包括:

    • page.$ 用于单个元素(如果未找到则返回 null)
    • page.$$ 用于多个元素(总是返回一个数组)

    您可以操作/读取/与这些函数的返回类型进行交互,在您的情况下,将是这样的(未经测试!):

      const offersDetails = await page.$$(".offers-details");
      const codes = [];
    
      for (const offerDetail of offersDetails) {
         const couponCode = await offerDetail.$('.coupon-code');
    
         if (couponCode) {
           const cpText = await couponCode.$eval('.btn-copy', (el) => el.attributes('data-clipboard-text'));
           console.log(cpText);
           codes.push(cpText);
         }
      }
    

    注意所有page 函数都是异步的,需要awaited。

    第二种方法是从page.evaluate 返回数组,这更简单。

    const codes = await page.evaluate(() => {
       const codes = [];
       // code here
       return codes;
    });
    

    【讨论】:

    • 我会尝试使用 page.$ 和 page.$$。在第二种方法中,当我使用jQuery每个函数获取所有元素时,如果我想从两个元素中获取两个数组,我认为它不起作用。如果我使用第二种方式,我将不得不执行重复的代码,它并不完美。
    猜你喜欢
    • 1970-01-01
    • 2017-12-28
    • 2019-02-12
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 2021-11-05
    • 2012-07-05
    • 1970-01-01
    相关资源
    最近更新 更多