申圣兵+姚方元
摘要:該文通過對常見校園APP中提取網(wǎng)頁課表的技術(shù)進行了分析,介紹了其核心的算法及具體實現(xiàn),最后提出了進一步完善的方法。
關鍵詞:校園APP;網(wǎng)頁課表;網(wǎng)頁解析
中圖分類號:TP311 文獻標識碼:A文章編號:1009-3044(2016)12-0215-02
由于智能手機的迅速普及,校園類APP異?;鸨?,課程格子、超級課程表等等校園應用APP受到了廣大學生們的喜愛,這些校園類應用APP以學生們經(jīng)常使用的課表作為切入點,是它們成功的一項重要的因素,那么它們是如何將課表移植到手機上的呢?
高校的教務系統(tǒng),主要是正方、青果、強智等幾種。如正方官網(wǎng)介紹成功案例有1000多家高校,它們的課表基本以網(wǎng)頁形式展示,所以,提取網(wǎng)頁課表成為這類校園應用APP比較核心的算法。
1 算法分析
我們以正方教務系統(tǒng)提供的課表為例來分析算法設計,下面是正方系統(tǒng)提供的課表圖。
1.1課表分析
課表以一個18行9列的表格顯示,第一行顯示星期,第二行顯示早晨,第三行開始到倒數(shù)第二行之間為課程顯示信息,中間又有兩行分別用來分隔上午和下午、下午和晚上,最后一行顯示課表的備注信息。
課表第1列顯示早晨、上、下午和晚上,第2列顯示節(jié)次,第3列到最后顯示相關課程信息。
1.2算法設計思路
課表的信息是顯示在一個以表格的第3行第3列為左上角,倒數(shù)第二行最后一列為右下角這樣的一個矩形區(qū)域的,由于我校一天最多只有10節(jié)課,一周7天,所以我們以一個10行7列的二維數(shù)組對課程表信息進行掃描,以便提取課程開始節(jié)次、結(jié)束節(jié)次及星期等關鍵信息,如果其他學校安排的一天課程節(jié)次數(shù)不同,就將數(shù)組稍作調(diào)整。由于網(wǎng)頁表格顯示具有不同于常規(guī)表格的特點,這給我們設計算法帶來了難處。比如一行中某一列如果有課程信息:計算機應用基礎【必修】
2節(jié)/周[1-2]節(jié)(01-06,08-18)
【給排水高1501】
【教二棟208】,由于我們的課程安排一般是一次2節(jié)或以上,所以標記會有rowspan屬性,它的值就是安排的連續(xù)節(jié)次,這樣它占用了下面行的列數(shù),下面相應行的列數(shù)即標記數(shù)就會減少。如果正常的列數(shù)為7列,那么到下面的行數(shù)就可能出現(xiàn)4列或5列甚至更少的情況,這是網(wǎng)頁表格常見的特征。
2 算法實現(xiàn)
2.1課表實體類的實現(xiàn)
我們設計一個實體類Course來存儲課程信息,它的設計如下:
2.2課表解析關鍵算法的實現(xiàn)
課表解析我們是通過jsoup來完成的,jsoup 是一款Java 的HTML解析器,可直接解析某個URL地址、HTML文本內(nèi)容。它提供了一套非常省力的API,可通過DOM,CSS以及類似于jQuery的操作方法來取出和操作數(shù)據(jù)。
首先我們移除一些無用的數(shù)據(jù):我們需要移除第1、2、7、12、15、16、17、18行及相應行第1列數(shù)據(jù),如下圖所示:
然后,我們通過循環(huán)遍歷行、列來得到課程信息,并將它存儲到Course類的一個集合里面。如下圖所示:
這其中,用到了一個獲取當前課程信息為周幾的一個函數(shù)fillMap(column, map, i),它的作用就是用來解決上面所提到的網(wǎng)頁表格特點的,它的基本思路是這樣的:首先將一個10行7列的數(shù)組進行清零,然后就對網(wǎng)頁表格進行掃描,將當前行從第1列直到最后一列逐列掃描,掃描過的列就將值置1,如果列有rowspan屬性的,就將相應的值置1,周幾即為當前列號。
最后,我們看看實現(xiàn)的提取課表的效果圖:
3 結(jié)束語
上述算法能適用絕大部分學校課表的情況,能夠滿足基本要求;但也存在一些不足之處,比如:課表的單雙周問題,課表如果同時有1節(jié)、2節(jié)甚至多節(jié)的情況等等,需要進一步進行完善。
參考文獻:
[1] 陳哲. 垂直搜索中網(wǎng)頁抓取技術(shù)的研究[J]. 科技信息, 2009(22).
[2] 陳忠菊. 正則表達式的研究和在網(wǎng)頁抓取中的應用[J]. 電腦編程技巧與維護, 2014(23).
[3] 劉艷平. Python模擬登錄網(wǎng)站并抓取網(wǎng)頁的方法[J]. 微型電腦應用, 2015(2).