python中的正则表达式与下载图片保存进文件夹中

本文深入探讨了正则表达式的应用,从基本语法到高级模式匹配,包括数字、字母、IP地址、特定字符串的匹配,以及如何使用正则表达式进行网页抓取,如抓取贴吧图片,并详细介绍了Python中的re模块用法。

import re

 

# 通过正则表达式进行匹配

# 匹配'.',因为'.'是通配符,所有得加转义符'\'

print(re.search(r"\.","I love FishC.com"))

 

# 可以使用'\d'进行匹配数字,

# 一个\d代表匹配一个数字,多个\d代表匹配多个数字

print(re.search(r"\d\d\d","I love 123 FishC.com"))

 

print(re.search(r'\d\d\d\.\d\d\d\.\d\d\d\.\d\d\d','192.168.111.123'))

 

# [aeiou]匹配字符串中第一个出现'aeiou'的字符

print(re.search(r'[aeiou]',"I love 123 FishC.com"))

 

# [a-zA-Z]匹配字符串中第一个出现字母的字符

print(re.search(r'[a-zA-Z]','I love FishC.com'))

# [0-9]匹配字符串中第一个出现数字的字符

print(re.search(r'[0-9]','I 1 love FishC.com'))

 

# '3'代表匹配三个b

print(re.search('ab{3}c','abbbc'))

 

# '{3,10}表示匹配最少三个b,最多10个b'

print(re.search('ab{3,10}','abbb'))


 

# [01]\d\d|2[0-4]\d|25[0-5] 匹配字符串中值为0到255的数字,如果百位是0或者1则后面可以为任意数字,

# 如果百位是2则后面只能是0-4,如果百位和十位是25则个位一定只能是0-5

print(re.search(r'[01]\d\d|2[0-4]\d|25[0-5]','1'))

 

# 匹配ip地址,{0,1}表示出现0次或者1次,{3}表示出现三次

print(re.search(r'(([01]{0,1}\d{0,1}\d|2[0-4]\d|25[0-5])\.){3}([01]{0,1}\d{0,1}\d|2[0-4]\d|25[0-5])','1.1.1.1'))

 

# 匹配FishC或则FishD

print(re.search(r'Fish(C|D)',"FishD"))

 

# 匹配以FishC开始的字符串

print(re.search(r'^FishC','FishC.com!'))

 

# 匹配以FishC结束的字符串

print(re.search(r'FishC$',"loveFishC"))

 

print(re.search(r'(FishC)\1','FishCFishCFishC.com'))

 

# 查找字符中所有的字母字符

print(re.findall(r"[a-z]","FishC.com123"))

 

# 取反,输出结果是F,C,\n

print(re.findall(r'[^a-z]','FishC.com\n'))

 

s = "<html><title>I love FishC.com</title></html>"

# <.+>为贪婪模式

print(re.search(r"<.+>",s))

 

# 非贪婪模式匹配

print(re.search(r"<.+?>",s))

 

print(re.search(r'(FishC)\060','FishC0'))

 

# 其中_被认为是字母,\b表示匹配被隔开的字符串,可以用字符或则空格隔开

print(re.findall(r"FishC\b","FishC.com!FishC_com!(FishC)"))

 

# \B与\b相反

print(re.findall(r"py\B",'py'))

 

# 编译形式的正则表达式

p = re.compile(r"[A-Z]+")

w = p.findall("I Love FishC")

print(w)

 

# group()方法

result = re.search(r" (\w+) (\w+)","I love FishC.com")

last_result = result.group()

first_result = result.group(1)

print(first_result)

 

# \w    匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9_]'。

 

print(re.findall("\w",'aaaaa'))

 

 

实例版本1:

import urllib.request

import re

 

def open_https://blog.csdn.net/url(url):

    req = urllib.request.Request(url)

    req.add_header('User-Agent','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36')

    page = urllib.request.urlopen(req)

    html = page.read().decode('utf-8')

 

    return html

 

def get_img(html):

    # [^"]表示出去"之外的所有字符串

    p = r'<img src="([^"]+\.jpg)'

    imglist = re.findall(p,html)

 

    # for each in imglist:

    #     print(each)

    

    for each in imglist:

        filename = each.split('/')[-1]

        urllib.request.urlretrieve(each,filename,None)

 

if __name__ == '__main__':

    url = 'https://tieba.baidu.com/f?kw=%C0%EE%D2%E3'

    get_img(open_https://blog.csdn.net/url(url))

 

实例版本2:增加写入相应的文件夹中

import urllib.request

import re

import os


 

def open_https://blog.csdn.net/url(url):

    req = urllib.request.Request(url)

    req.add_header('User-Agent','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36')

    page = urllib.request.urlopen(req)

    html = page.read().decode('utf-8')

 

    return html

 

def get_img(html,dir_name):

    # [^"]表示出去"之外的所有字符串

    p = r'<img src="([^"]+\.jpg)'

    imglist = re.findall(p,html)

 

    # for each in imglist:

    #     print(each)

    os.mkdir(dir_name)

    


 

    for each in imglist:

        

        filename = each.split('/')[-1]

        work_path=os.path.join(dir_name,filename)  

 

       # urlretrieve(url, filename=None, reporthook=None, data=None)

       # 参数url:下载链接地址

       # 参数filename:指定了保存本地路径(如果参数未指定,urllib会生成一个临时文件保存数据。)

       # 参数reporthook:是一个回调函数,当连接上服务器、以及相应的数据块传输完毕时会触发该回调,

       # 我们可以利用这个回调函数来显示当前的下载进度。

       # 参数data:指post导服务器的数据,该方法返回一个包含两个元素的(filename, headers) 元组,

       # filename 表示保存到本地的路径,header表示服务器的响应头

        urllib.request.urlretrieve(each,work_path,None)

        # urllib.request.urlretrieve(each,filename,None)

 

if __name__ == '__main__':

    url = 'https://tieba.baidu.com/f?kw=%C0%EE%D2%E3'

    get_img(open_https://blog.csdn.net/url(url),"tieba_dir")

实例版本3:

import urllib.request

import re

import os

 

# 读取链接中的内容

def open_https://blog.csdn.net/url(url):

    req = urllib.request.Request(url)

    req.add_header('User-Agent','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36')

    page = urllib.request.urlopen(req)

    html = page.read()

    # html = page.read()

    return html

 

def get_img(html,dir_name,url):

    # [^"]表示出去"之外的所有字符串

    p = r'<img src="([^"]+\.jpg)'

    # 读取图片地址

    html = open_https://blog.csdn.net/url(url)

    imglist = re.findall(p,html.decode('utf-8'))

    

    # for each in imglist:

    #     print(each)

    os.mkdir(dir_name)

    os.chdir(dir_name)


 

    for each in imglist:

        # 下载图片

        img = open_url(https://blog.csdn.net/each)

        filename = each.split('/')[-1]

        # work_path=os.path.join(dir_name,filename)  

        # wb指以二进制格式打开一个文件只用于写入

        with open(filename,'wb') as f:

            f.write(img)

            f.close()

       # urlretrieve(url, filename=None, reporthook=None, data=None)

       # 参数url:下载链接地址

       # 参数filename:指定了保存本地路径(如果参数未指定,urllib会生成一个临时文件保存数据。)

       # 参数reporthook:是一个回调函数,当连接上服务器、以及相应的数据块传输完毕时会触发该回调,

       # 我们可以利用这个回调函数来显示当前的下载进度。

       # 参数data:指post导服务器的数据,该方法返回一个包含两个元素的(filename, headers) 元组,

       # filename 表示保存到本地的路径,header表示服务器的响应头

       # urllib.request.urlretrieve(each,work_path,None)

       # urllib.request.urlretrieve(each,filename,None)

 

if __name__ == '__main__':

    url = 'https://tieba.baidu.com/f?kw=%C0%EE%D2%E3&fr=ala0&tpl=5'

    get_img(open_https://blog.csdn.net/url(url),"tieba_dir",url)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值