芜湖,直接上代码,其实估计不少系统都能通用。

强智的新版教务,可以自己看看自己的地址是不是以下类似:

登录后的首页:http://教务网地址/jsxsd/framework/xsMain.jsp

直接打开此地址能出现课表:http://教务网地址/jsxsd/xskb/xskb_list.do

DOM 结构类似于:

<td width="123" height="28" align="center" valign="top">
    <input type="hidden" name="jx0415zbdiv_1" value="8E220CC39FEE47B3B827C5ECBE005C7D-3-1">
    <input type="hidden" name="jx0415zbdiv_2" value="8E220CC39FEE47B3B827C5ECBE005C7D-3-2">
    <div id="8E220CC39FEE47B3B827C5ECBE005C7D-3-1" class="kbcontent1" style="display: none;">网络协议分析及编程B<br><font title="周次(节次)">9-16(周)</font><br><font title="教室">十教西附楼203</font><br></div>
    <div id="8E220CC39FEE47B3B827C5ECBE005C7D-3-2" style="" class="kbcontent">网络协议分析及编程B<br><font title="老师">王颖讲师(高校)</font><br><font title="周次(节次)">9-16(周)[01-02节]</font><br><font title="教室">十教西附楼203</font><br></div>
</td>
file

页面长得像这样:

file

无脑正则就完事了(

因为憨批教务系统在手机端打开会直接跳转提示屏幕宽度不够,所以这里用 Ajax 直接同步访问课程表所在的 iframe 地址,直接把页面内容再返回给 Parser

function scheduleHtmlProvider(iframeContent = "", frameContent = "", dom = document) {
/**
 作者:hjthjthjt
 博客:https://jakting.com
*/
    var request = new XMLHttpRequest();
    request.open('GET', '/jsxsd/xskb/xskb_list.do', false); 
    request.send(null);
    if (request.status === 200) {
      return request.responseText.replace(/[\r\n]/g,"");
    }

}

非常的粗暴,正则拿 td,正则取文本,各种正则(

正则 YES(

function scheduleHtmlParser(html) {
    //除函数名外都可编辑
    //传入的参数为上一步函数获取到的html
    //可使用正则匹配
    //可使用解析dom匹配,工具内置了$,跟jquery使用方法一样,直接用就可以了,参考:https://juejin.im/post/5ea131f76fb9a03c8122d6b9
    //以下为示例,您可以完全重写或在此基础上更改、
    console.info(html);
    let result = [];
    let resultT = [];
    //上课时间
    const regexT = /<th width="70" height="28" align="center">.*?第.*?节 <br\/>(.*?)-(.*?) .*?<\/th>/gm;
    let timeFlag = 0;
    while ((t = regexT.exec(html)) !== null) {
        if (t.index === regexT.lastIndex) {
            regexT.lastIndex++;
        }
        let reT = {}
        t.forEach((matchT, groupIndexT) => {
            console.log("matchT: "+matchT)
            switch(groupIndexT){
                case 1:
                    reT.section = ++timeFlag;
                    reT.startTime = matchT;
                    let hour1 = parseInt(matchT.split(':')[0]);
                    let minute1 = parseInt(matchT.split(':')[1]);
                    if( (minute1+45)>=60 ){
                        minute1 = minute1+45-60;
                        hour1++;
                    }else{
                        minute1 += 45;
                    }
                    reT.endTime = ((hour1<10)?"0":"")+hour1+":"+minute1;
                    resultT.push(reT);
                    reT = {}
                    console.log(timeFlag+"1")
                    break;
                case 2:
                    reT.section = ++timeFlag;
                    reT.endTime = matchT;
                    let hour2 = parseInt(matchT.split(':')[0]);
                    let minute2 = parseInt(matchT.split(':')[1]);
                    if( (minute2-45)<0 ){
                        minute2 = minute2-45+60;
                        hour2--;
                    }else{
                        minute2 -= 45;
                    }
                    reT.startTime = ((hour2<10)?"0":"")+hour2+":"+minute2;
                    resultT.push(reT);
                    reT = {}
                    console.log(timeFlag+"2")
                    break;
            }
        });
    }

    //课程
    const regex = /kbcontent1.*?<div id=".*?-(.*?)-2".*?style="display: none;" class="kbcontent".*?>(.*?)<\/div>/gm;
    var log;
    while ((m = regex.exec(html)) !== null) {
        log = "";
        if (m.index === regex.lastIndex) {
            regex.lastIndex++;
        }

        var weekDay;
        m.forEach((match, groupIndex) => {

            switch(groupIndex){
                case 1:
                    weekDay = parseInt(match)
                    break;
                case 2:
                    //log += ("\n内容:"+match);
                    const regexS = /(.*?)<br\/><font title='老师'>(.*?)<\/font><br\/><font title='周次\(节次\)'>(.*?)\(周\)\[(.*?)节\]<\/font><br\/><font title='教室'>(.*?)<\/font><br\/>/gm;
                    while ((mm = regexS.exec(match)) !== null) {
                        if (mm.index === regexS.lastIndex) {
                            regex.lastIndex++;
                        }

                        let re = { sections: [], weeks: [] }
                        mm.forEach((matchS, groupIndexS) => {
                            switch(groupIndexS){
                                case 1:
                                    console.info("星期"+weekDay)
                                    re.day = weekDay;
                                    matchS = matchS.replace("---------------------<br>","")
                                    matchS = matchS.replace("<br/>","")
                                    console.info("   课程名:"+matchS+"\n");
                                    re.name = matchS;
                                    break;
                                case 2:
                                    console.info("   老师:"+matchS+"\n");
                                    re.teacher = matchS;
                                    break;
                                case 3:
                                    console.info("   周次:"+matchS+"\n");
                                    if(matchS.search('-') != -1){ //如果不止一周
                                        let begin = matchS.split('-')[0];
                                        let end = matchS.split('-')[1];
                                        for(let iii = parseInt(begin);iii<=parseInt(end);iii++){
                                            re.weeks.push(iii);
                                        }
                                    }else{ //只有一周
                                        re.weeks.push(parseInt(matchS))
                                    }

                                    break;
                                case 4:
                                    console.info("   节次:"+matchS+"\n");
                                    if(matchS.search('-') != -1){ //如果不止一节
                                        let begin2 = matchS.split('-')[0];
                                        let end2 = matchS.split('-')[1];
                                        for(let iii2 = parseInt(begin2);iii2<=parseInt(end2);iii2++){
                                            let ree = {}
                                            ree.section = iii2;
                                            re.sections.push(ree);
                                        }
                                    }else{ //只有一节
                                        let ree2 = {}
                                        ree2.section = parseInt(matchS);
                                        re.sections.push(ree2)
                                    }
                                    break;
                                case 5:
                                    console.info("   教室:"+matchS+"\n");
                                    re.position = matchS;
                                    break;
                            }
                        });
                        result.push(re);
                    }
                    //console.log(log);
                    break;
            }
        });
    }

     console.info(resultT)
     console.info(result)
     return { courseInfos: result, sectionTimes: resultT}
   }

欢迎使用嗷

file

芜湖,107 人了,除了我自己测试的 4 次,那就是 103 个人头(((((

芜湖,207人了