es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Problema de extracción de datos con todas las clases iguales utilizando Puppeteer.

Estoy tratando de extraer todos los datos de precios de este sitio https://www.bynogame.com/tr/oyunlar/knight-online/gold-bar utilizando Puppeteer.

Puedo extraer los precios uno por uno, pero no puedo obtener todos los elementos p, se devuelve null como resultado. Aquí está mi código que funciona para extraer uno por uno, y el código a continuación para extraer todos los datos que no funciona. ¿Dónde me equivoco?

const puppeteer = require("puppeteer");
const gb = async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  await page.goto('https://www.bynogame.com/tr/oyunlar/knight-online/gold-bar');

  const data = await page.$eval('body > div.container.mb-5 > div > div:nth-child(1) > div.col-md-18.order-1.order-sm-12 > div > div:nth-child(1) > div > div > div.col-md-21 > div > div.col-md-4 > div > div > div > p', el => el.textContent); // El resultado es true
  await browser.close();
  console.log(data)
};

gb();

// Aquí no funciona.
const data = await page.$$eval('.col-md-24.mb-2.itemDiv .itemCard .row.d-flex.align-items-center .col-md-21 .row.d-flex.align-items-center .col-md-4 .row.d-flex.flex-column .col div p', obj => obj.map(p => p.textContent));
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Parece que hay un error en el selector CSS para el método $$eval. El selector debe ser un selector CSS válido que coincida con todos los elementos que deseas extraer. Basándonos en la estructura HTML de la página web, puedes intentar usando el siguiente selector:

    const data = await page.$$eval('.itemCard .item .itemDetails .price span', spans => spans.map(span => span.textContent.trim()));
    

    Este selector debe coincidir con todos los elementos span que contienen los datos de precio. Ten en cuenta que estamos utilizando el método $$eval en lugar de $eval, que devuelve un array de todos los elementos coincidentes en lugar de solo uno.

    Asegúrate también de verificar si la página se ha cargado por completo antes de ejecutar este código. Puedes usar el método waitForSelector o la opción waitUntil en page.goto para asegurarte de que el elemento que deseas extraer esté presente antes de ejecutar el código de extracción.

Comments are closed.