无法在 Javascript 中的第 n 个子选择器中使用变量值

Unable to use value of variable inside nth-child selector in Javascript

我正在尝试使用元素选择器中的变量值 p:nth-child(0),而不是数字 0,我想放置一个变量的值,在这种情况下,就是for循环的i

但是报错

        throw new Error("n-th rule couldn't be parsed ('" + formula + "')");
        ^

Error: n-th rule couldn't be parsed ('')

我不知道这里发生了什么怪事。据我所知,我的代码似乎是正确的。

这是我的代码 -

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");
})

编辑: 为了更正确地理解,我在这里试图实现的是获得游戏的大小。它列在网站上。但问题是写游戏大小的段落并不总是保持不变。所以我在这里做的是尝试创建检查所有段落并找到包含文本“Size:”的段落。

为了实现这一点,我正在做一个 for 循环,它将遍历所有段落并找到游戏大小的段落的第 n 个子编号。所以我创建了 gameSizeP 它将保存段落编号,因为我们不知道该值,它只是初始化而不是声明。我创建了一个 Boolen (gameSizePStatus),它被声明为 false。所以 For Loop 将继续它的循环,直到 gameSizePStatus 为真。当它得到一个包含 text

的 Paragraph 时,它将变为 true

很抱歉我在 for 循环的条件下打错了字,我输入了 , 而不是 ;。 而且我傻了,我重新声明了gameSizeP和gameSizePStatus。修复它但没有更改错误。出现同样的错误。

现在当我尝试 运行 它时,它会抛出一个错误。那是什么错误?上面已经写过了。

IDK 如果这是整个问题,但您在循环中重新声明了变量“gameSizePStatus”和“gameSizeP”。这可能会导致“文本”变量行寻找一个不存在于“i”值过高的元素。这也可能会导致您的“gameSize”行在尝试查找空字符串值时出错。您还应该在调用“.text()”之前进行空值检查,这样当您到达一个不存在的元素时就不会抛出错误。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Optional_chaining

再读一遍,你的 for 循环声明中有一个逗号,而不是一个分号,在“i++”之后有一个额外的分号,而且你并没有执行循环,因为你分配了“gameSizePStatus” " 为假,循环希望它为真。这意味着当尝试 运行“$('p:nth-child('+gameSizeP+')')”时“gameSizeP”为空。即使这没有出错,它也可能 return undefined 并在“.text()”.

上抛出错误

由于我正在重写我的评论作为答案,所以我还要说“gameSizePStatus”是一个不必要的变量。您可以使用 other/better/simpler/cleaner 逻辑来做同样的事情。而且声明时不需要为“gameSizeP”赋值。这使得以后检查它的值更容易。

这是我重写的代码。为了清楚起见,我只包括相关的 if 声明。

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
    }
}