Holi需要。
之前爬的课表,现在需要将那些个一连串的字符串分割成想要的单独的数据,做个性化推送。
程序的前面和之前一样,模拟登录。
在处理选课/改课这个网页的时候,还是蛮复杂的。
遇神杀神,见鬼杀鬼。
爬虫
|
|
正个页面有一张大table,但是里面分布的真不整齐。
新方法s.extract():
删除特定的标签和其标签下的内容
方法:
去除标签:[s.extract() for s in soup('script')]
s.extract()方法可以删除标签或指定标签下的内容。
获取指定td下的内容:
row.findAll('td', attrs={'valign': "middle"})[:-1]:
这几次爬虫对于切片还是用的很好的。
爬回待处理table:
|
|
前几项都是可以直接存到MySQL,现在要做的就是把 上课地点/星期/节次/周次 这一栏切割后存进MySQL。
方法:split()
首先分析爬回的table。
里面的上课地点/星期/节次/周次可以分为三类:
- 空。比如综合英语,科学道德与学分。
- 一周只有一节课的课。
- 一周有两节课的课。
讲道理是要按照三种方法来对字符型切割。
但是该怎么来分类。
我的第一个思路是用:try,except。
但是这几个并不是用来处理选择结构的吧。
但是try,except,else,finally还是很好用的。
选择结构?难道不应该是if,else吗?
对!就是它!
对这几种不同类型的上课地点/星期/节次/周次字符串的长度进行分析,三类的长度大概如下:
第一类:长度为0;
第二类:长度为50~60;
第三类:长度60~90.
这样一来就按照上课地点/星期/节次/周次的长度来判断分割方法。
if
下面包含两部分:
- 字符串长度大于60的,即一周有两节课的情况。
- 一周有两节课的情况,将该课程在数据库存两次,但是两次的上课时间、地点、周次是不一样的。
else
处理长度小于60的,即一周只要一节课的课。
except
当前两项都出现异常时,其必然是第一类情况,字符串为空,直接存进就可以。
split
split的几种用法:split("/")[0]
:按照“/”分割,取第一个切片。
split("(")[1].split(")")[0][0]
取“()”内的字符串的第一个。
最后
将里面的简单字符串都处理为数字。
for e in reader:
# 是否是学位课
if e['学位课'] == '是':
e['学位课'] = '1'
else:
e['学位课'] = '0'
# 学期
if e['上课学期'] == '2016秋':
e['上课学期'] = '0'
else:
e['上课学期'] = '1'
存进数据库了。
这次还是发现了很多的问题。
归根结底,还是基础不太好,是得花时间在研习下Python基础。