Python学习笔记 第二部分 - 正则表达式 与 爬虫小实例(抓取豆瓣电影中评分大于等于8分的影片)
2013-02-04 20:29 VVG 阅读(2710) 评论(0) 编辑 收藏 举报一、正则表达式
python正则常用的函数和方法
compile(pattern,flags=0) 对正则表达式pattern进行编译,flags是可选标识符,并返回一个regex对象
match(pattern,string,flags=0) 尝试用正则表达式模式pattern匹配字符串string,flags是可选标识符,如果匹配成功,则返回一个匹配对象;否则返回None
search(pattern,string[,flags]) 在字符串string中搜索正则表达式模式pattern的第一次出现,flags是可选标识符,如果匹配成功,则返回一个匹配对象;否则返回None
findall(pattern,string[,flags]) 在字符串string中搜索正则表达式模式pattern的所有(非重复)出现;返回一个匹配对象的列表
finditer(pattern,string[,flags]) 和findall()相同,但返回的不是列表而是迭代器;对于每个匹配,该迭代器返回一个匹配对象
split(pattern,string,max=0) 根据正则表达式pattern中的分隔符把字符串string分隔为一个列表,返回成功匹配的列表,最多分隔max次(默认是分隔所有匹配的地方)
sub(pattern,repl,string,max=0) 把字符串string中所有匹配正则表达式pattern的地方替换成字符串repl,如果max的值没有给出,则对所有匹配的地方进行替换
group(num=0) 返回全部匹配对象(或指定编号是num的子组)
groups() 返回一个包含全部匹配的子组的元组(如果没有匹配成功,就返回一个空元组)
==================================================================================
import re m = re.match('foo','foo') #match 函数尝试从字符串开头开始对模式进行匹配 if m is not None: m.group() # search() 在一个字符串中查找一个模式:search检查参数字符串任意位置的地方与正则表达式模式的匹配情况,与match(),不同 m = re.search('foo','seafood') # 如果用match() 则会匹配失败,返回None if m is not None:m.group() #用search成功匹配
m = re.match('(\w\w\w)-(\d\d\d)','abc-123') m.group() #所有匹配部分 #'abc-123' m.group(1) #'abc' m.group(2) #'123'
m.groups() #获得包含所有匹配子组的元组
#('abc','123')
re.findall('car','carry the barcardi to the car') #findall返回一个匹配列表 ['car', 'car', 'car']
re.sub('X','Mr.Smith','attn:X\n\nDear X,\n') # sub返回替换后的字符串 # 'attn:Mr.Smith\n\nDear Mr.Smith,\n' re.subn('X','Mr.Smith','attn:X\n\nDear X,\n') #subn返回替换后的字符串,和替换次数的一个元组 #('attn:Mr.Smith\n\nDear Mr.Smith,\n', 2)
python小爬虫——我的第一个实例
#! /usr/bin/env python # coding=utf-8 ## #到豆瓣电影列表抓去大于等于8分的电影# #http://movie.douban.com/tag/%E5%8A%A8%E4%BD%9C?start=0&type=T import urllib2 import re import sys # 获取当前系统编码格式 type = sys.getfilesystemencoding() j = 0 for i in range(0, 5000, 20): url = 'http://movie.douban.com/tag/%E5%8A%A8%E4%BD%9C?' hash = 'start=%d&type=T' % i url = url + hash print(url) # 读取url内容 content = urllib2.urlopen(url).read() # 转换编码 content = content.decode("UTF-8").encode(type) # 读取电影名称 match = re.findall(r'<div\s+class="pl2"><a.+?>(.+?)/\s*<span.+?<\/a>', content) # 读取分数 match2 = re.findall(r'<span\s+class="rating_nums">([0-9.]+)<\/span>', content) # 压缩到一个列表 zipc = zip(match, match2) # 打开文档 f = open('douban.txt', 'a') # 写入文件 for name in zipc: #大于8分的电影 if float(name[1])>=8: f.write(name[0]) f.write(name[1]) f.write('\n') j = j + 1 print name[0] print j print ('总共抓取电影数据'+ str(j) +'条').decode("UTF-8").encode(type) print 'done' f.close()
得到的结果大致如下:
飓风营救 8.1
蝙蝠侠:黑暗骑士崛起 8.4
碟中谍4 8.1
谍影重重 8.3
谍影重重3 8.6
蝙蝠侠:黑暗骑士 9.4
速度与激情5 8.8
黑客帝国 8.3
V字仇杀队 8.7
复仇者联盟 8.7
007:大战皇家赌场 8.0
变脸 8.3
生化危机5:惩罚 8.3
敢死队 8.9
007:大破量子危机 8.4
英雄本色 8.6
十月围城 8.1
通缉令 9.2
死亡飞车 8.4
黑客帝国3:矩阵革命 8.2
无间道 8.7
空中监狱 8.0
加勒比海盗 8.4
被解救的姜戈 8.5
阿凡达 8.7
让子弹飞 8.8
新龙门客栈 8.3
纵横四海 8.6
源代码 8.3
X战警:第一战 8.0
铁甲钢拳 8.1
变形金刚 8.0
搏击俱乐部 9.1
虎胆龙威 8.1
角斗士 8.2
转载请注明出处:http://www.cnblogs.com/NNUF/