代码改变世界

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

  VVG  阅读(2712)  评论(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

 

编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
点击右上角即可分享
微信分享提示