Estoy tratando de extraer todos los datos de precios de este sitio https://www.bynogame.com/tr/oyunlar/knight-online/gold-bar usando el titiritero.
Puedo eliminar los precios uno por uno, pero no puedo obtener todos los elementos p, se devuelven datos nulos. Aquí está mi código que funciona para desechar uno por uno, y el siguiente código para desechar todos los datos que no funcionan. ¿Dónde estoy haciendo mal?
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); //Output is true await browser.close(); console.log(data) }; gb(); //Here is not work. 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));No había ningún elemento con .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 selector en la página https://www.bynogame.com/tr/oyunlar/knight-online/gold-bar .
Puede intentarlo yendo a la página, luego abra la consola y ejecute document.querySelectorAll . Por ejemplo:
document.querySelectorAll('.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')Me muestra una matriz vacía, lo que significa que ningún elemento HTML coincide con el selector dado.
No necesita un selector tan largo. Cuando esté en la página, puede ver que el precio estaba dentro de la etiqueta <p> , con clases de font-weight-bolder text-black m-0 . En primer lugar, verifique si algún otro elemento comparte el mismo selector que el precio consultando la etiqueta <p> , con clases de font-weight-bolder text-black m-0 en la consola.
document.querySelectorAll('p.font-weight-bolder.text-black.m-0') --- Output --- NodeList(9) [ p.font-weight-bolder.text-black.m-0, p.font-weight-bolder.text-black.m-0, p.font-weight-bolder.text-black.m-0, p.font-weight-bolder.text-black.m-0, p.font-weight-bolder.text-black.m-0, p.font-weight-bolder.text-black.m-0, p.font-weight-bolder.text-black.m-0, p.font-weight-bolder.text-black.m-0, p.font-weight-bolder.text-black.m-0 ] Al verificar la salida, descubrí que los elementos devueltos tenían el precio que estaba buscando. Por lo tanto, puedo sustituir el selector correcto en la page.$$eval . El código final será
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"); // Get element with <p class="font-weight-bolder text-black m-0"> const data = await page.$$eval("p.font-weight-bolder.text-black.m-0", (obj) => obj.map((p) => p.textContent) ); await browser.close(); console.log(data); }; gb();