无法在 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
}
}
我正在尝试使用元素选择器中的变量值 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
}
}