Javascript 在两个类之间刮取数据
我使用cheerio从特定网站获取信息 网站源代码:Javascript 在两个类之间刮取数据,javascript,node.js,web-scraping,cheerio,Javascript,Node.js,Web Scraping,Cheerio,我使用cheerio从特定网站获取信息 网站源代码: 我怎样才能得到这个呢?这里有一个方案,它迭代.row>div元素,并使用状态机遍历这四种状态: 寻找第一个“col-12” 正在寻找之后的第一个“col-xl-4” 计算连续的“col-xl-4”项目 数完 下面是在node.js中运行的示例实现: const cheerio = require('cheerio'); const sampleHTML = ` <div class="row"> <
我怎样才能得到这个呢?这里有一个方案,它迭代
.row>div
元素,并使用状态机遍历这四种状态:
const cheerio = require('cheerio');
const sampleHTML = `
<div class="row">
<div class="col-12"></div>
<div class="col-xl-4"></div>
<div class="col-xl-4"></div>
<div class="col-xl-4"></div>
<div class="col-12"></div>
<div class="col-12"></div>
<div class="col-12"></div>
</div>
`;
let $ = cheerio.load(sampleHTML);
let divs = $(".row > div");
let state = "looking-col-12";
let cnt = 0;
divs.each((i, div) => {
let item = $(div);
switch (state) {
case "looking-col-12":
if (item.hasClass("col-12")) {
state = "lookingFirst-xl-4";
}
break;
case "lookingFirst-xl-4":
if (item.hasClass("col-xl-4")) {
state = "counting-xl-4";
cnt = 1;
}
break;
case "counting-xl-4":
if (item.hasClass("col-xl-4")) {
++cnt;
} else {
state = "done";
}
break;
default:
break;
}
});
console.log(cnt);
const cheerio=require('cheerio');
常量示例HTML=`
`;
让$=cheerio.load(sampleHTML);
设divs=$(“.row>div”);
让state=“looking-col-12”;
设cnt=0;
每个分区((i,分区)=>{
让项目=$(div);
开关(状态){
案例“looking-col-12”:
if(项目类别(“col-12”)){
state=“lookingFirst-xl-4”;
}
打破
案例“lookingFirst-xl-4”:
if(项目等级(“col-xl-4”)){
state=“counting-xl-4”;
cnt=1;
}
打破
案例“counting-xl-4”:
if(项目等级(“col-xl-4”)){
++碳纳米管;
}否则{
state=“完成”;
}
打破
违约:
打破
}
});
控制台日志(cnt);
我知道你想在这里统计班级,但为什么?你的目标是什么?获取.row
的直接子级。遍历每个子对象。当您找到.col-12
子项时,开始计算后续.col-xl-4
子项,直到找到下一个.col-12
。我不认为你可以直接用选择器来做。我知道你可以用一些代码和迭代循环来完成。我也很高兴知道这里真正的最终目标是什么,因为可能还有其他方法来实现它。@DenisG.Labrecque我数了数,因为我想知道每天有多少课程。页面每天都在更新,并且总是有不同数量的col-xl-4
classes。它确实适用于sampleHTML
,但是当使用网站url而不是sampleHTMLcnt
时,保持为0。不知何故,divs。每个都没有被调用。@Lesh-然后在你的问题中添加一个实际HTML的文本版本,这样我们就可以练习了。我已经添加了文本版本。但我真的不明白为什么它不能与网站一起工作url@Lesh-当我修复HTML中所有缺少的引号时,代码在该HTML上对我有效。在id=“box
和一些class=“xxx
上缺少结束引号。如果HTML被弄乱了,那么类名最终会包含垃圾,因此它们不匹配。我的错。忘记添加引号了。我已经对它进行了测试,它可以正常工作,但是用URL替换sampleHTML
就不行了。它应该可以工作,因为它几乎是相同的代码,只是没有文本。
const cheerio = require('cheerio');
const sampleHTML = `
<div class="row">
<div class="col-12"></div>
<div class="col-xl-4"></div>
<div class="col-xl-4"></div>
<div class="col-xl-4"></div>
<div class="col-12"></div>
<div class="col-12"></div>
<div class="col-12"></div>
</div>
`;
let $ = cheerio.load(sampleHTML);
let divs = $(".row > div");
let state = "looking-col-12";
let cnt = 0;
divs.each((i, div) => {
let item = $(div);
switch (state) {
case "looking-col-12":
if (item.hasClass("col-12")) {
state = "lookingFirst-xl-4";
}
break;
case "lookingFirst-xl-4":
if (item.hasClass("col-xl-4")) {
state = "counting-xl-4";
cnt = 1;
}
break;
case "counting-xl-4":
if (item.hasClass("col-xl-4")) {
++cnt;
} else {
state = "done";
}
break;
default:
break;
}
});
console.log(cnt);