代码改变世界

Python学习笔记 第二部分 - 正则表达式 与 爬虫小实例(抓取豆瓣电影中评分大于等于8分的影片)

2013-02-04 20:29  VVG  阅读(2445)  评论(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