Estoy tratando de raspar ( esta ) página de producto, específicamente el modal que aparece cuando hace clic en "Ver todas las ofertas".
La estructura html es solo una tabla simple, estoy tratando de obtener cada elemento "Tamaño". El problema es que cada vez que ejecuto mi código, abre el modal pero solo devuelve algunos tamaños de zapatos aleatorios que no están en orden.
Ejemplo:
shoeSizeBids: [ '14', '11.5', '10.5', '11', '8.5', '11', '9', '9', '7', '13' ]
Mi código:
const bidsChartSel = '#market-summary > div.ask.ask-button-b > div.sale-size > div:nth-child(2)'; await Promise.all([page.click(bidsChartSel)]); // Get all the shoe size bids const shoeSizeBids= await page.evaluate(() => Array.from( document.querySelectorAll('tbody > tr > td:nth-child(1)'), (element) => element.textContent ) );
El orden de clasificación proviene de esa página, es decir, los tamaños se representan en ese orden. Para ordenarlos correctamente, necesitaría:
Eso se puede lograr con lo siguiente:
const uniqueSortedSizes = Array.from(new Set(shoeSizeBids)) .map(s => parseFloat(s, 10)) .sort((a, b) => a > b ? 1: a < b ? -1 : 0);
Está haciendo coincidir varias tablas HTML con el selector actual ( tbody > tr > td:nth-child(1)
). el que está dentro de los usos modales:
.activity-table > tbody > tr > td:nth-child(1)
También puede usar page.$$eval
como una abreviatura de titiritero para Array.from(document.querySelectorAll(selector))
:
const shoeSizeBids = await page.$$eval('.activity-table > tbody > tr > td:nth-child(1)', elems => elems.map(el => el.innerText))