正则表达式-网站爬虫实战_阳光天堂

python编程快速上手(持续更新中…)

正则表达式概述

用来检索、和替换

正则表达式可以
测试字符串某个模式
实现按照某种规则替换文本
根据模式匹配从字符串提取一个字符串(爬虫)

正则表达式构成

正则表达式工具介绍

RegexBuddy

正则表达式使用

匹配单个字符

  • . 匹配任意单个字符(除\n)

  • [] 列举,匹配[] 中列举的内容

    [ab] 匹配 a 或者 b

    [a-z] 匹配所有的小写字母

    [A-Z] 匹配大写字母

    [0-9] 匹配数字

    [a-zA-Z] 匹配所有的小写字母和大写字母

  • \d 匹配所有的数字 等价于 [0-9]

  • \D 非数字

  • \s 空格

  • \S 非空格

  • \w 匹配 字母、数字、下划线

    [a-zA-Z0-9_]

  • \W 非数字、非字母、非下划线

匹配多个字符

  • *表示前一个字符出现 0次或者 无限次

  • + 表示 前一个字符出现 1次或者 无限次

  • ?表示 前一个字符出现 0 次或者 1次 (要不不出现,要不只能出现一次)

  • {m} 表示前一个字符,连续出现 m次

  • {m,n} 表示前一个字符,连续出现最少m次,最多n次

    m 一定要小于 n

匹配开头和结尾

^ 表示 匹配 以后一个字符开头

$表示匹配 以前一个字符结尾

re模块操作

re模块的作用: python提供的用于正则操作的模块

"""
1、导入模块
2、通过 match 方法,验证正则
3、判断 验证是否成功
4、如果成功,获取匹配的结果

"""
import re

# 1、导入模块
# 2、通过 match 方法,验证正则
# re.match("正则表达式", "要验证/检测的字符串")
# match() 方法如果匹配成功,返回 match object 对象
# match() 方法如果匹配失败,返回 None
#        正则字符串    要检测的内容
result = re.match("\w{4,20}@163\.com$", "hello@163.com")
# 3、判断 验证是否成功
if result:
    print("匹配成功!")
    # 4、如果成功,获取匹配的结果
    print("匹配结果:", result.group())
else:
    print("匹配失败!")

匹配分组“|”

"""
1、导入模块
2、通过 match 方法,验证正则
3、判断 验证是否成功
4、如果成功,获取匹配的结果

"""
import re

# 1、导入模块
# 2、通过 match 方法,验证正则
result = re.match("^[0-9]?[0-9]$|^100$", "99")
# 3、判断 验证是否成功
if result:
    print("匹配成功!")
    # 4、如果成功,获取匹配的结果
    print("匹配结果:", result.group())
else:
    print("匹配失败!")

匹配分组“()”

"""
1、导入模块
2、match() 进行匹配
3、判断匹配的结果
4、取出匹配的内容

"""
import re

# 1、导入模块
# 2match() 进行匹配
# result = re.match("\w{4,20}@(163|126|qq|sina)\.com$", "hello@126.com")
result = re.match("(\d{3,4})-(\d{7,8})", "010-12345678")
# 3、判断匹配的结果
if result:
    print("匹配成功!")
    # 4、取出匹配的内容
    print("匹配结果:", result.group())
    print("提取区号:", result.group(1))
    print("提取电话号码:", result.group(2))

else:
    print("匹配失败!")

匹配分组“\”

?P 给分组起别名,别名为name1

"""
1、导入模块
2、通过 match 方法,验证正则
3、判断 验证是否成功
4、如果成功,获取匹配的结果

"""
import re

# 1、导入模块
# 2、通过 match 方法,验证正则
#                                      \1   --> \ 有特殊用法
#                                      \\   --> \
# \1 表示引用第1个分组
# result = re.match("<([a-zA-Z0-9]+)>.*</\\1>", "<html>asdbasldfj</html>")
result = re.match("<([a-zA-Z0-9]+)><([a-zA-Z0-9]+)>.*</\\2></\\1>", "<html><h1>asdbj</h1></html>")
# 3、判断 验证是否成功
if result:
    print("匹配成功!")
    # 4、如果成功,获取匹配的结果
    print("匹配结果:", result.group())
else:
    print("匹配失败!")

re高级方法

1.search
#result = re.match(“hello”, “xhello@163.com”)
#result = re.search(“hello”, “xhello@163.com”)
#match 和 search的区别
#1)match 从需要检测.group的字符串的开头位置匹配,如果失败返回 None
#2)search 从需要检测的字符串中搜索满足正则的内容,有则返回match object对象

2.findall
#二、findall(“正则表达式”, “待查找的内容”) 搜索全部,返回值是个列表
#result = re.findall("\d+", “阅读次数:9999,转发次数:6666,评论次数:38”)

3.sub替换

#三、sub(“正则表达式”, “新的内容”, “要替换的字符串”) 字符串替换(按照正则,查找字符串并且替换为指定的内容)
#返回值,是替换后的字符串findall
#result = re.sub("\d+", “10000”, “阅读次数:9999,转发次数:6666,评论次数:38”)

4.split
#四、split(“正则表达式”, “待拆分的字符串”) 按照正则拆分字符串,返回值是一个列表

Python贪婪和非贪婪

  • 贪婪:默认,表示在满足正则的情况尽可能多的取内容
  • 非贪婪:表示在满足正则的情况下,尽可能少的取内容
  • 贪婪的转变为非贪婪: 在 * ? + {} 的后面再加上 ?就可以了
"""
1、导入模块
2、通过 match 方法,验证正则
3、判断 验证是否成功
4、如果成功,获取匹配的结果

"""
import re

# 1、导入模块
# 2、通过 match 方法,验证正则
# 贪婪:满足正则的情况下,尽可能多的取内容   默认为贪婪模式
# 非贪婪:满足正则的情况下,尽可能少的取内容
# 把贪婪模式该为非贪婪模式,需要使用符号:?+ * ? {} 后面添加? 可以变成非贪婪
# result = re.match("aaa(\d+?)", "aaa123456")

str1 = """
<img data-original="https://rpic.douyucdn.cn/appCovers/2016/11/13/1213973_201611131917_small.jpg" src="https://rpic.douyucdn.cn/appCovers/2016/11/13/1213973_201611131917_small.jpg" style="display: inline;">
"""

result = re.search('src=\"(.*?)\"', str1)

# 3、判断 验证是否成功
if result:
    print("匹配成功!")
    # 4、如果成功,获取匹配的结果
    print("匹配结果:", result.group())
    print("地址:",result.group(1))
else:
    print("匹配失败!")

r的作用

"""
1、导入模块
2、通过 match 方法,验证正则
3、判断 验证是否成功
4、如果成功,获取匹配的结果

"""
import re

# 1、导入模块
# 2、通过 match 方法,验证正则
#
#                                      \\   --> \
# r的作用 让正则中的 \ 没有特殊含义(转义) 就是代表原声的 斜杠

result = re.match(r"<([a-zA-Z0-9]+)><([a-zA-Z0-9]+)>.*</\2></\1>", "<html><h1>asdbj</h1></html>")
# 3、判断 验证是否成功
if result:
    print("匹配成功!")
    # 4、如果成功,获取匹配的结果
    print("匹配结果:", result.group())
else:
    print("匹配失败!")

简单爬虫_阳光天堂

"""
https

一、定义函数获取列表页的内容页地址 get_movie_links()
1、定义列表的地址 https://www.ygdy8.com/html/gndy/dyzz/list_23_1.html
    
2、打开url地址,获取数据
3、解码获取到的数据
4、使用正则得到所有的影片内容也地址

二、主函数 main



"""
import urllib.request
import re


def get_movie_links():
    """获取列表页影片信息"""
    # 1、定义列表的地址
    film_list_url = "https://www.ygdy8.com/html/gndy/dyzz/list_23_1.html"
    # 2、打开url地址,获取数据
    reponse_list = urllib.request.urlopen(film_list_url)

    # 2.1 通过read()读取网络资源数据
    response_list_data = reponse_list.read()

    # 3、解码获取到的数据
    response_list_text = response_list_data.decode("GBK")
    # 4、使用正则得到所有的影片内容地址
    #  4.1 使用findall() 根据正则查找所有影片对应的内容页地址
    url_list = re.findall(r"<a href=\"(.*)\" class=\"ulink\">(.*)</a>", response_list_text)
    #  4.2 保存地址
    # url_list = [('/html/.......', 'xxx影片'),('/html/.......', 'xxx影片')]
    # print(url_list)

    #  定义一个字典,用于保存影片信息
    films_dict = {}

    #  4.3 循环遍历 url_list
    i = 1
    for content_url,film_name  in url_list:
        # 拼接内容页地址
        content_url = "https://www.ygdy8.com"+content_url
        # content_url = 'https://www.ygdy8.com/html/gndy/dyzz/20210920/61870.html'
        # print("影片名称:%s,内容页地址:%s" % (film_name, content_url))

        # 4.4 打开内容页地址
        response_content = urllib.request.urlopen(content_url)
        # 4.5 接收内容页数据
        # 4.6 读取网络资源
        response_content_data = response_content.read()
        # 4.7 解码得到内容页的文本内容
        response_content_text = response_content_data.decode("GBK")
        # 4.8 取出下载地https://www.ygdy8.net址
        # print(response_content_text)
        result = re.search(r"<a target=\"_blank\" href=\"(.*?)\">", response_content_text)
        # print("11111111111", result)
        print(result.group(1))

        # 字典
        # {"xxxx影片": "xxx地址"}
        films_dict[film_name] = result.group(1)
        print("已经获取%d条信息" % i)
        i += 1

    return films_dict


def main():
    """"""
    films_dict = get_movie_links()
    # print(films_dict)

    # 把字典遍历输出
    for film_name,film_link  in films_dict.items():
        print("%s | %s" % (film_name, film_link))



if __name__ == '__main__':

    main()

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值