(modificado después de los consejos de los comentarios)
Lo que estoy tratando de hacer : raspado web para obtener los 100 nombres de criptomonedas de este sitio web .
Problema : el selector que utilicé no selecciona todos los nombres criptográficos en la página. Solo algunos de ellos son seleccionados.
En esa página web, hay 100 filas y cada fila tiene un nombre de criptomoneda. Así que 100 nombres en total.
Si uso este selector tr td a[href*="/currencies/"][href$="/"]:not([href$="/markets/"]) ,
Encuentra los 100 elementos en la página, y puedo obtener la URL de cada criptografía de estos 100 elementos. (hay 100 criptomonedas en una página)
una muestra de los 100 elementos seleccionados:
<a href="/currencies/ethereum/" class="cmc-link"><div class="sc-16r8icm-0 sc-1teo54s-0 dBKWCw"><img class="coin-logo" src="https://s2.coinmarketcap.com/static/img/coins/64x64/1027.png" loading="lazy" alt="ETH logo"><div class="sc-16r8icm-0 sc-1teo54s-1 dNOTPP"><p font-weight="semibold" color="text" font-size="1" class="sc-1eb5slv-0 iworPT">Ethereum</p><div class="sc-1teo54s-2 fZIJcI"><div class="sc-1teo54s-3 etWhyV">2</div><p color="text3" class="sc-1eb5slv-0 gGIpIK coin-item-symbol" font-size="1">ETH</p></div></div></div></a>-Ningún problema hasta ahora.
Pero, si agrego >div>div>p a este selector para obtener cada nombre criptográfico,
( tr td a[href*="/currencies/"][href$="/"]:not([href$="/markets/"])>div>div>p ),
solo se seleccionan 19 elementos, no los 100 elementos.
una muestra de los elementos seleccionados:
<p font-weight="semibold" color="text" font-size="1" class="sc-1eb5slv-0 iworPT">Ethereum</p>Si me desplazo hacia abajo en la página, la cantidad de elementos seleccionados aumenta, pero lo que quiero es obtener los 100 elementos sin desplazarme con la rueda.
Gracias por adelantado :)
(Estoy probando web scraping usando Playwright, pero creo que esta es solo una pregunta general sobre el selector de CSS)
Esto no es un problema con los selectores css. Es una página cargada dinámicamente, por lo que para obtener su contenido debe realizar una llamada API a
https://api.coinmarketcap.com/data-api/v3/map/all?listing_status=active,untracked&exchangeAux=is_active,status&cryptoAux=is_active,status&start=10001&limit=10000Una vez que haces eso, obtienes un json. Para extraer de eso el código de moneda, por ejemplo, necesita
const obj = JSON.parse(response); curs = obj['data']['cryptoCurrencyMap']si tu corres
for (let cur of curs) {console.log(cur['symbol'])}Deberías obtener bastantes códigos...