正则表达式

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

文章目录

  • 前言
  • 一、正则表达式
  • 二、常见匹配模式
  • 三、re.match()匹配
    • 1、最常规的匹配
    • 2、泛匹配
    • 3、匹配目标,分组匹配
    • 4、贪婪匹配
    • 5、非贪婪匹配(正则大量使用)
    • 6、匹配模式(re.S)
    • 7、转义
  • re.match()总结
  • 四、re.search()方法
    • 1、findall(a,b,c)方法
    • 2、re.sub()
  • re.search()总结
  • 五、对读书网站简单爬取
  • 六、对音乐网站简单爬取


前言

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


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

一、正则表达式

在这里插入图片描述

二、常见匹配模式

正则表达式_第1张图片
正则表达式_第2张图片
在这里插入图片描述

三、re.match()匹配

1、最常规的匹配

正则表达式_第3张图片

2、泛匹配

正则表达式_第4张图片
推荐使用泛匹配

3、匹配目标,分组匹配

正则表达式_第5张图片

4、贪婪匹配

明显特征:.*
正则表达式_第6张图片

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

标志性特征:.*?
正则表达式_第7张图片

6、匹配模式(re.S)

re.S用来进行多行匹配
正则表达式_第8张图片

7、转义

在特殊字符前加上 / 来保持我们想要保留的字符原型
正则表达式_第9张图片

re.match()总结

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

四、re.search()方法

正则表达式_第10张图片
强调:为方便匹配,能用search()就不用match()

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

a:利用解析方法,写的通用解析公式
b:将要解析的数据
c:re.S如果有多行要解析的数据
正则表达式_第11张图片

2、re.sub()

正则表达式_第12张图片

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 = ''\
        '.*?(.*?).*?(.*?)

'
#解析语法 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 = '.*?(.*?)'
    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)


你可能感兴趣的:(爬虫,正则表达式,python)