Estoy tratando de usar el valor de una variable dentro del selector de elementos que es p:nth-child(0) , en lugar de un número que es 0, quiero poner el valor de una variable, en este caso, es i de bucle for.
pero me esta dando error
throw new Error("n-th rule couldn't be parsed ('" + formula + "')"); ^ Error: n-th rule couldn't be parsed ('')No sé qué demonios está pasando aquí. Por lo que puedo ver, mi código parece correcto.
Aquí está mi código -
const express = require("express"); const request = require("request"); const cheerio = require("cheerio"); const app = express(); app.get("/", function(req, res){ var url = "randomGameDatabaseWebsite.com"; // get content of url by request module request(url, function(err, response, html){ if(!err && response.statusCode == 200){ //load html to cheerio const $ = cheerio.load(html); //get game size var gameSizeP; var gameSizePStatus = false; for(var i = 0; gameSizePStatus == true; i++;){ var text = $('p:nth-child('+i+')').text(); if(text.includes("Size: ")){ gameSizePStatus = true; gameSizeP = i; } else { gameSizePStatus = false; } } const gameSize = $('p:nth-child('+gameSizeP+')').text(); console.log(gameSize); } }); }); app.listen(3000, function(){ console.log("Application is successfully started on port 3000"); })Editar: para una comprensión más adecuada, lo que estoy tratando de lograr aquí es obtener el tamaño del juego. Está listado en el sitio web. Pero el problema es que el párrafo donde se escribe el tamaño del juego no siempre es el mismo. Entonces, lo que estoy haciendo aquí es tratar de crear que verifique todos los párrafos y encuentre el párrafo que tiene el texto "Tamaño:".
Para lograr esto, estoy haciendo un ciclo for, que recorrerá todos los párrafos y encontrará el número de hijo enésimo del párrafo del tamaño del juego. Así que creé gameSizeP que contendrá el número de párrafo ya que no sabemos el valor, solo se inicializa, no se declara. Y creé un Boolen (gameSizePStatus) que se declara como falso. Entonces, For Loop continuará su ciclo hasta que gameSizePStatus sea verdadero. y se hará realidad cuando obtenga un párrafo que contenga texto
Y perdón por el error tipográfico que cometí en la condición del bucle for, escribí , en lugar de ; . Y soy estúpido, volví a declarar gameSizeP y gameSizePStatus. Se corrigió pero no hubo cambios en el error. Obteniendo el mismo error.
Y ahora, cuando intento ejecutarlo, arroja un error. ¿Cuál es ese error? Escribí sobre eso ya arriba.
IDK si es todo el problema, pero está volviendo a declarar las variables "gameSizePStatus" y "gameSizeP" en su ciclo. Es probable que eso esté causando que la línea variable de "texto" busque un elemento que no existe en un valor "i" demasiado alto. Esto también probablemente causaría un error en su línea "gameSize" para tratar de encontrar un valor de cadena vacío. También debe hacer una verificación nula antes de llamar a ".text ()" para que no arroje un error cuando llegue a un elemento que no existe.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Optional_chaining
Volviendo a leer más, tiene una coma en su declaración de bucle for en lugar de un punto y coma con un punto y coma adicional después de "i++", y de todos modos no está haciendo el bucle, ya que asigna "gameSizePStatus" a falso y el loop quiere que sea verdad. Esto significa que "gameSizeP" está vacío cuando se intenta ejecutar "$('p:nth-child('+gameSizeP+')')". Incluso si esto no genera un error, es probable que devuelva undefined y arroje un error en ".text ()".
Como estoy reescribiendo mis comentarios como respuesta, también diré que "gameSizePStatus" es una variable innecesaria. Puede usar otra lógica/mejor/más simple/más limpia para hacer lo mismo. Y no es necesario que asigne un valor a "gameSizeP" al declararlo. Esto hace que verificar su valor sea más fácil más adelante.
Aquí está mi reescritura de su código. Solo incluyo la declaración if relevante para mayor claridad.
if(!err && response.statusCode == 200){ //load html to cheerio const $ = cheerio.load(html); //get game size var gameSizeP; for(var i = 0; ; i++){ var text = $('p:nth-child('+i+')')?.text(); if(text && text.includes("Size: ")){ gameSizeP = i; break; } } if (!gameSizeP){ return; } const gameSize = $('p:nth-child('+gameSizeP+')')?.text(); if (gameSize) { console.log(gameSize); // and whatever else you need to do with gameSize } }