栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

正则表达式-爬虫案例

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

正则表达式-爬虫案例

正则表达式概述

用来检索、和替换

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

正则表达式构成

正则表达式工具介绍

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、导入模块
# 2、match() 进行匹配
# 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]+)>.*", "asdbasldfj")
result = re.match("<([a-zA-Z0-9]+)><([a-zA-Z0-9]+)>.*", "asdbj")
# 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 = """

"""

result = re.search('src="https://www.mshxw.com/skin/sinaskin/image/nopic.gif"', 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]+)>.*", "asdbj")
# 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"(.*)", 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"", 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()

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/272923.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号