falcon
falcon

Reputation: 33

How do I define a variable as a scraped element using Puppeteer

const puppeteer = require('puppeteer');
(async () => {
  const browser = await puppeteer.launch({
        headless: false,
        defaultViewport: null
    })
  const page = await browser.newPage()
  
  await page.goto('https://www.supremenewyork.com/shop/sweatshirts/ftq968f24/lhrblx1z5')
var productName = await page.evaluate(() => {
    document.querySelector('div[id="details"] > p[itemprop="model"]').innerText;
})

console.log(productName);

})()

When I run my code that is supposed to grab the name of the supreme item, it says undefined when it's supposed to log it in the console.

Upvotes: 0

Views: 616

Answers (1)

Alexander Staroselsky
Alexander Staroselsky

Reputation: 38757

You are neither returning anything from the page.evaluate nor are you setting the value of productName. Try something like this instead that uses $eval to return the innerText of the matching element:

const puppeteer = require("puppeteer");

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

  await page.goto(
    "https://www.supremenewyork.com/shop/sweatshirts/ftq968f24/lhrblx1z5"
  );

  const productName = await page.$eval(
    'div[id="details"] > p[itemprop="model"]',
    (el) => el.innerText
  );

  console.log(productName);
})();

If you prefer to use evaluate it would look like:

const puppeteer = require("puppeteer");

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

  await page.goto(
    "https://www.supremenewyork.com/shop/sweatshirts/ftq968f24/lhrblx1z5"
  );

  const productName = await page.evaluate(() => {
    // notice the return
    return document.querySelector('div[id="details"] > p[itemprop="model"]').innerText;
  });

  console.log(productName);
})();

If innerText doesn't return anything you may instead need to use something like textContent.

Hopefully that helps!

Upvotes: 1

Related Questions