python 学习(三)
按照上次python 学习(二)的思路,第一步要实现从一个网站的页面上自动获取指定列表中的信息。折腾数日,得到一段可以正常运行的代码,如下:
#web2.py import re
import urllib.request def get_msg_for_url(s): if s =='':
print("not url!\n")
exit() ah_whdeps_url = {"ahswht":"http://www.ahwh.gov.cn/"} msg_from={"ahswht":"http://www.ahwh.gov.cn/zz/shwhc/gzdt5/"}
msg_re={"ahswht1":r'<div class="title"><a href="(.*)" title="(.*)" target="_blank">',
"ahswht2":r'<div class="time">\[(.*)\]</div>' } getTotalPageRe =r'共(.*)条 当前第(.*) 页</div>' res_url = 'aspx/doView.aspx?siteid=52&contentid=0&channelId=432&pchannelid=399&templateType=2&Page='
response=urllib.request.urlopen(msg_from[s])
html = response.read().decode("gbk") # 针对带汉字的网页进行解码 gtpr = re.findall(getTotalPageRe, html) # 获取信息总条数和页数
msg_totle = int(gtpr[0][0].strip()) # get the numbers of message
page_totle = int(gtpr[0][1].split('/')[1].strip()) # get the numbers of page m = 1 filename = s+'.txt'
f = open(filename,"w") for n in range(1, page_totle+1):
response = urllib.request.urlopen(ah_whdeps_url["ahswht"]+res_url+str(n))
html = response.read().decode('utf-8','ignore') gt = re.findall(msg_re[s+''], html) #抽取url页面中新闻的标题、网址 gd = re.findall(msg_re[s+''], html) #抽取url页面中的发布时间 for i in range(0,len(gt),1):
try:
f.write('%d\n%s\n%s\n%s\n'%(m,ah_whdeps_url[s]+gt[i][0][1:], gt[i][1], gd[i]))
m += 1
except UnicodeEncodeError as e:
pass print("There are %d messages to be saved!"%(m-1))
f.close() def main():
get_msg_for_url("ahswht") if __name__=="__main__":
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学习三---序列、列表、元组
一.序列 1.1.序列概念 pythn中最基本的数据结构是序列(sequence). 序列中每个元素被分配一个序号-元素索引,第一个索引是0,第二个是1,以此类推.类似JAVA中数组和集合中的下标. ...
- python学习 (三十三) Modules
1: 方法一: 导入整个模块 import math class ModulesDemo(): def builtin_modules(self): print(math.sqrt()) m = Mo ...
- Python学习三天计划-1
一.第一个Python程序 配置好环境变量后 打开CMD(命令提示符)程序,输入Python并回车 然后,在里面输入代码回车即可立即执行 Python解释器的作用是 将Python代码翻译成计算机认识 ...
- Python学习三天计划-3
面向对象 一.类的定义 1.类定义 class是关键字,表示要定义类了 类的属性,即定义在类中的变量(成员变量) 类的行为,即定义在类中的函数(成员方法) 2.对象 创建类对象的语法: class S ...
- Python学习(三) 输出任意格式的字符串以及字符串的切片
在Python中想要输出一句话,如下 a='hello world' print a //打印出的是hello world print 'hello \n world' //打印出的是 //hello ...
- Python学习(三):迭代器、生成器、装饰器、递归、算法、正则
1.迭代器 迭代器是访问集合的一种方式,迭代对象从集合的第一个元素开始访问,直到元素被访问结束,迭代器只能往前不能后退,最大的优点是不要求事先准备好整个迭代过程中的元素,这个特点使得它特别适合用于遍历 ...
- python 学习三
list循环删除下标会出错 L = [1,1,1,2,3,4,5]#list是根据下标来取值 #下标0,1,2,3,4,5,6 循环后下标错位 输出的结果是[1,2,4],把1也取到了 #l2 = [ ...
- Python学习三|列表、字典、元组、集合的特点以及类的一些定义
此表借鉴于他人 定义 使用方法 列表 可以包含不同类型的对象,可以增减元素,可以跟其他的列表结合或者把一个列表拆分,用[]来定义的 eg:aList=[123,'abc',4.56,['inner', ...
- python学习 (三十一) python中的class
1 python的类: Python类都继承自object. __init__: 构造函数,如果不写,有一个默认的. __init__: 这个构造函数只能有一个,Python中不能有多个构造函数. ...
- python学习三(数据保存到文件)
以写模式打开文件:需要指定写模式,如下所示 data = open('data.out','w') 如果文件已经存在,则会清空它现有的所有内容.要追加一个文件,需要使用访问模式a,会追加到下一行. 例 ...
随机推荐
- commons-lang使用
跟java.lang这个包的作用类似,Commons Lang这一组API也是提供一些基础的.通用的操作和处理,如自动生成toString()的结果.自动实现hashCode()和equals()方法 ...
- 如何看懂XDEBUG+WEBGRIND?(转)
看到一个很有用的东东,收藏.. http://blog.csdn.net/yukon12345/article/details/11408617 ~~~~~~~~~~ 使用: ...
- 【Xamarin-IOS 开发环境搭建】
MAC 比较贵,虚拟机的干活..... 配置完虚拟机.进去后 ,安装XCode的 时候 ,失败了.错误信息: But when i have tried to install the Xcode it ...
- logstash tomcat catalina.out 告警
<pre name="code" class="html">[elk@dr-mysql01 tomcat]$ cat logstash_tomcat ...
- 利用Visual Studio寻找C#程序必要的运行库文件
在工程打包中,有时候很头痛的就是运行所需要的库文件不能够全面的包含进来,特别是有时候调用了一系列外部扩展.对于这些问题,我们可以借用Visual Studio的打包功能帮助我们寻找软件运行必须的库文件 ...
- 算法导论(第三版) Exercises4.2(求最大和子数组的算法优化过程)
4.1-1 如所有元素都为负,则返回所有元素中最大的负数. 4.1-2(暴力法求最大和子数组) struct subarray { int start, end, sum; }; void brute ...
- Raid1源代码分析--初始化流程
初始化流程代码量比较少,也比较简单.主要是run函数.(我阅读的代码的linux内核版本是2.6.32.61) 四.初始化流程分析 run函数顾名思义,很简单这就是在RAID1开始运行时调用,进行一些 ...
- Maven--多模块依赖实例解析(五)
<Maven--搭建开发环境(一)> <Maven--构建企业级仓库(二)> <Maven—几个需要补充的问题(三)> <Maven—生命周期和插件(四)&g ...
- 在Windows7上搭建Cocos2d-x win32开发环境
很多其它相关内容请查看本人博客:http://www.bokeyi.com/ll/category/cocos2d-x/ 建议:为了避免安全相关的问题,请以管理员权限执行全部的操作,当执行命令的时候, ...
- 一个提供jsp免费空间的站点
EATJ美国JSP虚拟主机商提供免费jsp空间申请,50M空间,每月3G的流量限制,支持Java5.0/6.0.PHP.CGI.Perl.SSI等,提供2个MySQL数据库,Tomcat v5.5/v ...