正则表达式

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

上文讲到了response使用详情
本文讲解解析数据的第一种方法:正则表达式


提示:以下是本篇文章正文内容,下面案例可供参考

一、正则表达式

在这里插入图片描述

二、常见匹配模式

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三、re.match()匹配

1、最常规的匹配

在这里插入图片描述

2、泛匹配

在这里插入图片描述
推荐使用泛匹配

3、匹配目标,分组匹配

在这里插入图片描述

4、贪婪匹配

明显特征:.*
在这里插入图片描述

5、非贪婪匹配(正则大量使用)

标志性特征:.*?
在这里插入图片描述

6、匹配模式(re.S)

re.S用来进行多行匹配
在这里插入图片描述

7、转义

在特殊字符前加上 / 来保持我们想要保留的字符原型
在这里插入图片描述

re.match()总结

尽量使用泛匹配,使用括号得到匹配目标、尽量使用非贪婪模式、有换行符就用re.S

四、re.search()方法

在这里插入图片描述
强调:为方便匹配,能用search()就不用match()

1、findall(a,b,c)方法

a:利用解析方法,写的通用解析公式
b:将要解析的数据
c:re.S如果有多行要解析的数据
在这里插入图片描述

2、re.sub()

在这里插入图片描述

re.search()总结

注意利用好正则表达式写法,正则表达式非常容易写错,假如返回值为空的话,基本是正则表达式的语法有问题。需要非常仔细!

五、对读书网站简单爬取

'''
1、明确目标站点
2、明确爬取的需求
今日需求,标题 图片(保存到本地)  详情页连接  ,以及翻页
'''
import requests,re,os
# url = 'https://book.douban.com/latest?subcat=%E5%85%A8%E9%83%A8&p=4'
header ={
    这里是自己电脑浏览器的User-Agent
}
def get_data():
    response = requests.get(url_f, headers=header)
    text = response.text
    return text
def analysis(data):
    z = '<li\sclass="media\sclearfix".*?<img\sclass="subject-cover".*?src="(.*?)"/></a>'\
        '.*?<a\sclass="fleft"\shref="(.*?)">(.*?)</a>.*?<p\sclass="subject-abstract\scolor-gray">(.*?)</p>'#解析语法
    res = re.findall(z,data,re.S)
    for data in res:
        img = data[0]
        web = data[1]
        name = data[2]
        author = data[3].strip()
        print("图片:",img)
        print("网站:",web)
        print("书名:",name)
        print("作者:",author)
        print("================")
        save_img(img,web,name,author)
#现在想把图片单独保存下来以jpg格式,,需要利用os模块,
def save_img(i,w,n,a):
    # 要想保存图片 第一步就是得请求图片二进制数据
    img_data = requests.get(i).content
    with open('db.txt','a',encoding='utf-8')as f:
        f.write('图片:'+i+'\n')
        f.write('网址:'+w+'\n')
        f.write('名字:'+n+'\n')
        f.write('作者:'+a+'\n')
    if not os.path.exists('DATA'):
        os.makedirs('DATA')
    with open('DATA/{}.jpg'.format(n),'wb')as f:
        f.write(img_data)
if __name__ == '__main__':
    #翻页直接写在main函数里面
    url = 'https://book.douban.com/latest?subcat=%E5%85%A8%E9%83%A8&p={}'
    for i in range(1,16):
        print(f"========正在打印第{i}页")
        url_f = url.format(i)
        a = get_data()
        analysis(a)

六、对音乐网站简单爬取

import os,requests,re
shouye_url = 'https://www.hifini.com/'
headers = {
    这里是自己电脑浏览器的User-Agent
}
def get_data(url):
    response = requests.get(url,headers=headers)
    res = response.text
    if response.status_code==200:
        return res
def parse_data(data):
    #获取歌曲网站,名字,MP3
    z = '<li\sclass="media\sthread\stap\s\s".*?>.*?<div\sclass="subject\sbreak-all".*?<a\shref="(.*?)">(.*?)</a>'
    res = re.findall(z,data,re.S)
    for i in res:
        # https: // hifini.com / thread - 21844.htm
        web = 'https://www.hifini.com/'+i[0]
        name =i[1]
        print(f'歌曲网站:{web}')
        print(f'歌曲名字:{name}')
        get_song_link(web)
        # https://www.hifini.com / get_music.php?key = ZPt2g / X4pu1ERvOFnfadi7AUrqXn9Pdex424u9p9WB2QZYhvirHjHcWOej1AlDsdz4HAkJdj7cxgVgXksnmvvw
def get_song_link(link):
        xiangqingye = requests.get(link,headers=headers)
        xiangqingye_text = xiangqingye.text
        # print(xiangqingye_text)#详情页源码
        song_re = "music:\s\[.*?title:\s'(.*?)',.*?url:\s'(.*?)',"
        x = re.findall(song_re,xiangqingye_text,re.S)
        # print('歌曲信息:',x)
        for i in x:
            song_name = i[0]
            song_link = 'https://www.hifini.com/'+i[1]
            # print('歌名:',song_name)
            # print('歌曲资源:',song_link)
            song_content = requests.get(song_link,headers=headers).content#请求歌曲二进制资源
            print(song_content)
            if not os.path.exists('歌曲'):
                os.makedirs('歌曲')
            with open('歌曲\{}.m4a'.format(song_name),'wb')as f:
                f.write(song_content)
if __name__ == '__main__':
    a = get_data(shouye_url)
    parse_data(a)


  • 10
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值