python 学习(三)

按照上次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 message
26     page_totle = int(gtpr[0][1].split(‘/‘)[1].strip())         # get the numbers of page
27
28     m = 1
29
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 += 1
45             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‘)  我们的口号是:“先让程序动起来,再让它跑得快!”

——————————————————————

既然这段代码可以实现原来设想的功能,下一步的事情就是在这段代码的基础上进行启动了。 

下面的第一步,可以将指定页面的正则表达式独立出来,不在程序中硬编码,而是保存在另外一个独立的文本文件。这样的话,如果要获取另外一个网站指定栏目下面的信息,只需要在文本文件中添加相应的规则即可,不必再重要写代码。

如此一来,整个项目就比较清楚地划分为三个部分:一是输入文件;二是处理模块;三是输出文件。其中,输入文件定义获取信息的规则,处理模块负责从输入文件中读取信息提取规则,按照规则获取相关信息,再将获得的信息按固定格式,存入指定输出文件;输出文件保存信息。
时间: 2024-10-07 02:54:06

python 学习(三)的相关文章

Python学习三---序列、列表、元组

一.序列 1.1.序列概念 pythn中最基本的数据结构是序列(sequence). 序列中每个元素被分配一个序号-元素索引,第一个索引是0,第二个是1,以此类推.类似JAVA中数组和集合中的下标. 从后向前,最后一个索引是-1,-2,.... python包含6种内建序列.最常用的两种类:列表和元组,其它内奸序列类型有字符串.Unicode字符串.buffer对象和xrange对象. 列表和元组的主要区别在于,列表可以修改,元组不能修改. 添加元素就用列表. 由于 一些原因不能修改时就用元组.

Python学习(三) Django框架简单搭建

为了快速学习Python进行Web的开发,所以我不准备从Python的基础学起,直接从Django框架入手,边学框架边学Python的基础知识. 下面就开始Django的快速开发之旅吧. 关于Django框架1.8的英文文档在其官网上都有,地址 https://docs.djangoproject.com/en/1.8/intro/ Python的开发手册地址:https://pythonspot.com/getting-started/ https://docs.djangoproject.c

python学习三十天(错误处理)

今日内容: 1.昨日作业 2.错误处理 一,昨日作业 题目:三级菜单使用递归和栈的方式写 递归方式 字典: university_list = { "安徽省": { "合肥": ["中国科技大学", "合肥工业大学"], "安庆": ["安庆学院"], "阜阳": ["阜阳学院"] }, "江苏省": { "南京&qu

python学习三天

加班到凌晨一点半很累很累,但是总觉得还是写点东西 . python运算符 以下假设变量: a=10,b=20: 运算符 描述 实例 + 加 - 两个对象相加 a + b 输出结果 30 - 减 - 得到负数或是一个数减去另一个数 a - b 输出结果 -10 * 乘 - 两个数相乘或是返回一个被重复若干次的字符串 a * b 输出结果 200 / 除 - x除以y b / a 输出结果 2 % 取模 - 返回除法的余数 b % a 输出结果 0 ** 幂 - 返回x的y次幂 a**b 为10的2

python 学习三十五天(socket的更多方法)

1.黏包 2.socket的更多方法介绍 3.验证客户端连接合法性 4.socketserver模块 一.黏包 1.现象: res=subprocess.Popen(cmd.decode('utf-8'), shell=True, stderr=subprocess.PIPE, stdout=subprocess.PIPE) 的结果的编码是以当前所在的系统为准的,如果是windows,那么res.stdout.read()读出的就是GBK编码的,在接收端需要用GBK解码 且只能从管道里读一次结果

python学习三十三天函数匿名函数lambda用法

python函数匿名函数lambda用法,是在多行语句转换一行语句,有点像三元运算符,只可以表示一些简单运算的,lambda做一些复杂的运算不太可能.分别对比普通函数和匿名函数的区别 1,普通的函数用法 def func(): print('aaa') func() 2,匿名函数的用法 f=lambda x,y:x*y m=f(3,5) print(m) 输出结果 15 匿名比较复杂的用法条件判断,匿名函数一般搭配函数内置函数使用 map() 文章来自(www.96net.com.cn) 原文地

python学习三十四天函数高阶函数定义及用法

python函数高阶函数是把函数当成一个变量,传递给函数作为参数,或者函数的返回值里面有函数,都称为高阶函数, 1,把函数作为参数传递 def dac(x,y): return x+y def test(n): print(n) test(dac) 输出结果为 函数类型function 2,把函数做为返回值,也是高阶函数 def test(x,y): return abs,x,y 输出结果为 列表,包含 函数,参数 文章来自(www.96net.com.cn) 原文地址:https://www.

python学习三(python代码的基本概念)

几个概念  1.表达式   一个类似于数字公式的东西,表达式一般仅仅用来计算一些结果,不会对程序产生实质性的影响,如果在交互模式中输入一个表达式,解释器会自动将表达式的结果输出  如:          1+2 3+4  2.语句  在程序中语句一般需要完成某中功能,比如打印信息,获取信息,为变量赋值..  如:         print()         a = 10  语句的执行一般会对程序产生影响   在交互模式中不一定会输出语句的执行结果  3.程序  程序就是由一条一条的语句和一条

python学习三(变量)

字面量和变量 字面量就是一个一个的值,如:1, 2,3,4,a,b,"hello" 字面量所表示的意思就是它的字面的值,在程序中可以直接使用字面量 变量可以用来保存字面量,并且变量中保存的字面量是不定的 如:a = 10 a = "hello" a = "b" 变量本身没有任何意思,它会根据不同的字面量表示不同的意思 变量和标示符  变量: python中使用变量,不需要声明,直接为变量赋值即可 a = 10 print(a) 不能使用没有进行赋

Python 学习三 基本数据类型

基本数据类型数字 int ,所有的功能,都放在int里   (类型通过ctrl+左键查看具体方法)    a1 = 123    a1 = 456 - 1212131415 Python 2 用long长整型表示 Python 3 没有长整型,都用int 字符串 str    s1 = "asdf"    s2 = "asdffas"列表 list    ...元组 tuple    ...字典 dict    ...布尔值 bool    ... 将字符串转化为数