Android解析网页课表的算法设计与实现
申圣兵+姚方元
摘要:该文通过对常见校园APP中提取网页课表的技术进行了分析,介绍了其核心的算法及具体实现,最后提出了进一步完善的方法。
关键词:校园APP;网页课表;网页解析
中图分类号:TP311 文献标识码:A文章编号:1009-3044(2016)12-0215-02
由于智能手机的迅速普及,校园类APP异常火爆,课程格子、超级课程表等等校园应用APP受到了广大学生们的喜爱,这些校园类应用APP以学生们经常使用的课表作为切入点,是它们成功的一项重要的因素,那么它们是如何将课表移植到手机上的呢?
高校的教务系统,主要是正方、青果、强智等几种。如正方官网介绍成功案例有1000多家高校,它们的课表基本以网页形式展示,所以,提取网页课表成为这类校园应用APP比较核心的算法。
1 算法分析
我们以正方教务系统提供的课表为例来分析算法设计,下面是正方系统提供的课表图。
1.1课表分析
课表以一个18行9列的表格显示,第一行显示星期,第二行显示早晨,第三行开始到倒数第二行之间为课程显示信息,中间又有两行分别用来分隔上午和下午、下午和晚上,最后一行显示课表的备注信息。
课表第1列显示早晨、上、下午和晚上,第2列显示节次,第3列到最后显示相关课程信息。
1.2算法设计思路
课表的信息是显示在一个以表格的第3行第3列为左上角,倒数第二行最后一列为右下角这样的一个矩形区域的,由于我校一天最多只有10节课,一周7天,所以我们以一个10行7列的二维数组对课程表信息进行扫描,以便提取课程开始节次、结束节次及星期等关键信息,如果其他学校安排的一天课程节次数不同,就将数组稍作调整。由于网页表格显示具有不同于常规表格的特点,这给我们设计算法带来了难处。比如一行中某一列如果有课程信息:计算机应用基础【必修】
2节/周[1-2]节(01-06,08-18)
【给排水高1501】
【教二栋208】,由于我们的课程安排一般是一次2节或以上,所以标记会有rowspan属性,它的值就是安排的连续节次,这样它占用了下面行的列数,下面相应行的列数即标记数就会减少。如果正常的列数为7列,那么到下面的行数就可能出现4列或5列甚至更少的情况,这是网页表格常见的特征。
2 算法实现
2.1课表实体类的实现
我们设计一个实体类Course来存储课程信息,它的设计如下:
2.2课表解析关键算法的实现
课表解析我们是通过jsoup来完成的,jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。
首先我们移除一些无用的数据:我们需要移除第1、2、7、12、15、16、17、18行及相应行第1列数据,如下图所示:
然后,我们通过循环遍历行、列来得到课程信息,并将它存储到Course类的一个集合里面。如下图所示:
这其中,用到了一个获取当前课程信息为周几的一个函数fillMap(column, map, i),它的作用就是用来解决上面所提到的网页表格特点的,它的基本思路是这样的:首先将一个10行7列的数组进行清零,然后就对网页表格进行扫描,将当前行从第1列直到最后一列逐列扫描,扫描过的列就将值置1,如果列有rowspan属性的,就将相应的值置1,周几即为当前列号。
最后,我们看看实现的提取课表的效果图:
3 结束语
上述算法能适用绝大部分学校课表的情况,能够满足基本要求;但也存在一些不足之处,比如:课表的单双周问题,课表如果同时有1节、2节甚至多节的情况等等,需要进一步进行完善。
参考文献:
[1] 陈哲. 垂直搜索中网页抓取技术的研究[J]. 科技信息, 2009(22).
[2] 陈忠菊. 正则表达式的研究和在网页抓取中的应用[J]. 电脑编程技巧与维护, 2014(23).
[3] 刘艳平. Python模拟登录网站并抓取网页的方法[J]. 微型电脑应用, 2015(2).