自学内容网 自学内容网

Python爬虫中使用re(正则表达式)

Python爬虫中使用re(正则表达式)

一、引言

在Python爬虫开发中,正则表达式(re)是一个强大的工具,它可以帮助我们从文本中提取、替换或者分割出我们想要的数据。正则表达式通过定义一系列的规则,来描述、匹配一系列符合某个句法规则的字符串。在爬虫中,我们经常需要从HTML页面中提取信息,而正则表达式提供了一种灵活且高效的方式来实现这一目的。

在这里插入图片描述

二、正则表达式的基本概念

1、正则表达式的组成

正则表达式由一系列字符组成,这些字符包括普通字符(例如,字母a到z)和特殊字符(称为"元字符")。普通字符表示它们自己,而元字符具有特殊含义。例如,.(点)匹配任意单个字符,*(星号)表示前面的字符可以出现零次或多次。

2、正则表达式的Python模块

Python中的re模块提供了对正则表达式的支持。通过这个模块,我们可以执行各种正则表达式相关的操作,如搜索、匹配、替换和分割等。

表达式类型表达式描述
字面量匹配abc匹配字符串 “abc”
任意字符.匹配任意单个字符(除了换行符)
字符类[abc]匹配任何一个字符 a、b 或 c
否定字符类[^abc]匹配除了 a、b、c 之外的任意单个字符
范围[a-z]匹配任何一个小写字母
预定义字符类\d匹配任何一个数字(0-9)
预定义字符类\D匹配任何非数字字符
预定义字符类\w匹配任何字母数字字符(等价于 [a-zA-Z0-9_]
预定义字符类\W匹配任何非字母数字字符
预定义字符类\s匹配任何空白字符(空格、制表符、换行符等)
预定义字符类\S匹配任何非空白字符
量词*匹配前面的子表达式0次或多次
量词+匹配前面的子表达式1次或多次
量词?匹配前面的子表达式0次或1次
量词{n}匹配确定的 n 次数
量词{n,}至少匹配 n 次
量词{n,m}至少匹配 n 次,但不超过 m 次
非贪婪匹配*?匹配前面的子表达式0次或多次,尽可能少地匹配
非贪婪匹配+?匹配前面的子表达式1次或多次,尽可能少地匹配
非贪婪匹配??匹配前面的子表达式0次或1次,尽可能少地匹配
非贪婪匹配{n,m}?至少匹配 n 次,但不超过 m 次,尽可能少地匹配
(...)将多个表达式组合成一个组,作为一个单独的单元
选择``
断言^匹配输入字符串的开始位置
断言$匹配输入字符串的结束位置
断言\b匹配一个单词边界,单词由字母、数字或下划线组成
断言\B匹配非单词边界
转义特殊字符\匹配特殊字符的字面量(例如,\n 匹配换行符)
1.1、步骤

以下是一些常用的re模块函数:

  • re.search(pattern, string):在字符串中搜索第一个与正则表达式匹配的结果。
  • re.findall(pattern, string):查找字符串中所有与正则表达式匹配的内容,并以列表形式返回所有匹配的结果。
  • re.sub(pattern, repl, string):替换字符串中所有匹配正则表达式的内容。
  • re.split(pattern, string):根据匹配的正则表达式分割字符串,返回一个列表。
  • re.compile(pattern):编译正则表达式模式,返回一个正则表达式对象,以提高匹配效率。

三、使用示例

1、提取电影信息

假设我们需要从一个电影信息页面中提取电影名称、主演和上映时间等信息。以下是一个使用正则表达式提取这些信息的示例代码:

import requests
import re

# 请求URL
url = 'https://maoyan.com/board/4'
# 请求头部
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'
}
# 解析页面函数
def parse_html(html):
    pattern = re.compile('<p class="name"><a href=".*?" title="(.*?)" data-act="boarditem-click" data-val="{movieId:\\d+}">(.*?)</a></p>.*?<p class="star">(.*?)</p>.*?<p class="releasetime">(.*?)</p>', re.S)
    items = re.findall(pattern, html)
    for item in items:
        yield {
            '电影名称': item[1],
            '主演': item[2].strip(),
            '上映时间': item[3]
        }

# 保存数据函数
def save_data():
    f = open('maoyan_top100.txt', 'w', encoding='utf-8')
    response = requests.get(url, headers=headers)
    for item in parse_html(response.text):
        f.write(str(item) + '\n')
    f.close()

if __name__ == '__main__':
    save_data()

四、总结

正则表达式在Python爬虫中扮演着重要的角色,它能够帮助我们从复杂的HTML页面中提取出结构化的数据。通过掌握正则表达式的基本概念和Python中的re模块,我们可以更加高效地进行网页数据的抓取和处理。


版权声明:本博客内容为原创,转载请保留原文链接及作者信息。

参考文章


原文地址:https://blog.csdn.net/NiNg_1_234/article/details/144255513

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!