python 学习(三)
来源:互联网 发布:淘宝店铺如何重新激活 编辑:程序博客网 时间:2024/05/29 08:29
按照上次python 学习(二)的思路,第一步要实现从一个网站的页面上自动获取指定列表中的信息。折腾数日,得到一段可以正常运行的代码,如下:
1 #web2.py 2 3 import re 4 import urllib.request 5 6 def get_msg_for_url(s): 7 8 if s =='': 9 print("not url!\n")10 exit()11 12 ah_whdeps_url = {"ahswht":"http://www.ahwh.gov.cn/"}13 14 msg_from={"ahswht":"http://www.ahwh.gov.cn/zz/shwhc/gzdt5/"}15 msg_re={"ahswht1":r'<div class="title"><a href="(.*)" title="(.*)" target="_blank">',16 "ahswht2":r'<div class="time">\[(.*)\]</div>' }17 18 getTotalPageRe =r'共(.*)条 当前第(.*) 页</div>'19 20 res_url = 'aspx/doView.aspx?siteid=52&contentid=0&channelId=432&pchannelid=399&templateType=2&Page='21 response=urllib.request.urlopen(msg_from[s])22 html = response.read().decode("gbk") # 针对带汉字的网页进行解码23 24 gtpr = re.findall(getTotalPageRe, html) # 获取信息总条数和页数25 msg_totle = int(gtpr[0][0].strip()) # get the numbers of message26 page_totle = int(gtpr[0][1].split('/')[1].strip()) # get the numbers of page27 28 m = 129 30 filename = s+'.txt'31 f = open(filename,"w")32 33 for n in range(1, page_totle+1):34 response = urllib.request.urlopen(ah_whdeps_url["ahswht"]+res_url+str(n))35 html = response.read().decode('utf-8','ignore')36 37 gt = re.findall(msg_re[s+'1'], html) #抽取url页面中新闻的标题、网址38 39 gd = re.findall(msg_re[s+'2'], html) #抽取url页面中的发布时间40 41 for i in range(0,len(gt),1):42 try:43 f.write('%d\n%s\n%s\n%s\n'%(m,ah_whdeps_url[s]+gt[i][0][1:], gt[i][1], gd[i]))44 m += 145 except UnicodeEncodeError as e:46 pass 47 48 print("There are %d messages to be saved!"%(m-1))49 f.close() 50 51 52 def main():53 get_msg_for_url("ahswht")54 55 if __name__=="__main__":56 main()
代码功能说明:第12行,定义指定网站;第14行定义指定网页。第15行定义抽取信息的正则表达式,这里是获取每条信息的标题及网址,如下图。第16行,定义抽取每条信息发布时间的正则表达式。
15 msg_re={"ahswht1":r'<div class="title"><a href="(.*)" title="(.*)" target="_blank">',16 "ahswht2":r'<div class="time">\[(.*)\]</div>' }
第18-26行:获取这个列表所有信息的条数以及页面数。方法是通过分析页上的一个特定字符串:“共?条 当前第?页”。第25行得到信息总条数,第26行得到页面数。
第30-40行:获取该列表下所有信息,并以[行号\n链接\n标题\n发布时间\n]的形式,保存到一个文本文件(如下图)中。
个人难点:写这段代码花费时间最长的地方是第35行,即网页上字符的编码与解码问题。现在是权宜之计,直接无视,即一旦发现某个标题行的字符串解码不出来,就跳到下一个标题上去,而不是让程序中断。html = response.read().decode('utf-8','ignore') 我们的口号是:“先让程序动起来,再让它跑得快!”
既然这段代码可以实现原来设想的功能,下一步的事情就是在这段代码的基础上进行启动了。
下面的第一步,可以将指定页面的正则表达式独立出来,不在程序中硬编码,而是保存在另外一个独立的文本文件。这样的话,如果要获取另外一个网站指定栏目下面的信息,只需要在文本文件中添加相应的规则即可,不必再重要写代码。
如此一来,整个项目就比较清楚地划分为三个部分:一是输入文件;二是处理模块;三是输出文件。其中,输入文件定义获取信息的规则,处理模块负责从输入文件中读取信息提取规则,按照规则获取相关信息,再将获得的信息按固定格式,存入指定输出文件;输出文件保存信息。
- Python学习(三)
- 学习Python (三)
- python 学习(三)
- python学习(三)
- python学习(三)
- python 学习(三)
- python 学习(三)
- python学习(三)
- python学习笔记(三)
- Python学习笔记(三)
- python学习笔记(三)
- python学习笔记:(三)
- Python学习笔记(三)
- Python基础教程学习(三)
- python学习小计(三)
- python学习笔记(三)
- Python学习笔记(三)
- python 学习笔记(三)
- Android 知识点梳理,较完整
- python学习(二)
- DL学习笔记【8】caffe参数调节-激活函数层
- Swift基础(二十二)UIAlertView,UIActionSheet,UIAlertController
- oracle里long类型的总结
- python 学习(三)
- 山东理工OJ 2075 最少拦截系统
- Spring AOP 的几个知识点
- 只使用代码创建WPF应用程序
- Linux下locate命令和find命令
- 【数据结构】单链表—合并两个排序链表 — 递归
- android调用系统分享
- [计算机网络]--NAT原理介绍
- DL学习笔记【9】caffe参数调节-全连接层