Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/453.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在两个类之间刮取数据_Javascript_Node.js_Web Scraping_Cheerio - Fatal编程技术网

Javascript 在两个类之间刮取数据

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

我使用cheerio从特定网站获取信息

网站源代码:


我怎样才能得到这个呢?

这里有一个方案,它迭代
.row>div
元素,并使用状态机遍历这四种状态:

  • 寻找第一个“col-12”
  • 正在寻找之后的第一个“col-xl-4”
  • 计算连续的“col-xl-4”项目
  • 数完
  • 下面是在node.js中运行的示例实现:

    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而不是sampleHTML
    cnt
    时,保持为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);