python爬虫工程师 成长之路四 正则表达式与Cookie

正则表达式介绍

正则表达式就是描述字符串排列的一种规则,其主要用于字符串的匹配,经常用于找到某一类符合格式要求的数据;在python中我们经常用re模块来实现正则表达式

正则表达式基础

原子

原子是正则表达式最基本的组成单位,正则表达式至少包含一个一个原子,常见的原子有:

  • 普通字符
  • 非打印字符
  • 通用字符
  • 原子表

普通字符
普通字符如数字,字母,下划线等都可以作为原子,yes中含有三个原子:y、e、s

hello中含有he,所以匹配成功
在这里插入图片描述
非打印字符
非打印字符指的是字符串中用于格式控制的符号常见的有\n换行符,\t制表符

a中有换行,所以匹配成功
在这里插入图片描述
通用字符
通用字符:一个原子可以匹配一类字符,人们常用的
常见的通用字符及其意义

字符 意义
\w 匹配任意一个字母、数字或下划线
\W 匹配除字母、数字和下划线以外的任意一个字符
\d 匹配任意一个十进制数
\D 匹配除十进制数以外的任意一个字符
\s 匹配任意一个空白字符
\S 匹配除空白字符以外的任意一个字符

匹配a中含有wpython的部分
在这里插入图片描述
原子表
原子表用[]表示,使用原子表可以定义一组地位平等的原子,匹配的时候取原子表中任意一个原子进行匹配,如[abc]str可以匹配字符串‘astr’,‘bstr’,‘cstr’;[^]代表除原子表里的均可以匹配,如 [^abc]str可以匹配[d-z]str,不能匹配
‘astr’,‘bstr’,‘cstr’

在这里插入图片描述

元字符

元字符:正则表达式中具有特殊含义的字符;元字符分为任意匹配字符,边界限制元字符,界定符,模式选择符,模式单元等

任意匹配字符
任意匹配字符‘.’,可用于匹配一个除换行符以外的任意字符
在这里插入图片描述
边界限制元字符

  • 用‘^‘匹配字符串的开始, ‘^abc‘表示可以匹配以abc开头的字符串,其余均不匹配
    在这里插入图片描述
  • 用’$‘匹配字符串的结束,‘$abc‘表示可以匹配以abc结尾的字符串,其余均不匹配
    在这里插入图片描述

限定符

常见限定符及其含义

限定符 含义
* 匹配0次、1次或多次前面的原子
匹配0次、1次前面的原子
+ 匹配1次或多次前面的原子
{n} 前面的原子恰好出现n次
{n,} 前面的原子至少出现n次
{n,m} 前面的原子至少出现n次,至多出现m次
| 模式选择符
() 模式单元符
  • *实例
    匹配任意次,可以是0次
    在这里插入图片描述

  • ?实例
    匹配0次或1次表示可以匹配不到
    在这里插入图片描述

  • +实例
    匹配一次或多次,不能是0次
    在这里插入图片描述

  • {n}实例
    {n}匹配前面原子恰好出现n次,其余不匹配
    在这里插入图片描述

  • {n,}实例
    {n,}匹配前面原子出现次数大于等于n,小于n的无法匹配
    在这里插入图片描述

  • {n,m}实例
    匹配前面原子出现次数在[n,m]之间
    在这里插入图片描述
    模式选择符
    模式选择符’|'可以设置多个匹配模式,匹配时满足任意一个都可以
    在这里插入图片描述
    模式单元符
    模式单元符‘()’,可以用()将原子组合成一个整体用于匹配,如(aa)表示把aa当做一个整体进行匹配,此时字符a是无法匹配的
    在这里插入图片描述

模式修正

在不修改正则表达式前提下,模式修正可以修正正则表达式的含义,从而调整匹配结果。

常见模式修正符及其含义

修正符 含义
I 匹配时忽略大小写
X 匹配时忽略模式中的空白
S 将字符串看作单行,换行符看做普通字符
  • I 实例
    加I之后忽略字母的大小写
    在这里插入图片描述
  • X 实例
    加x后忽略pattern中的空白
    在这里插入图片描述
  • S 实例
    加S后可以匹配换行符\n
    在这里插入图片描述

贪婪模式、懒惰模式

贪婪模式就是尽可能多的匹配,懒惰模式就是尽可能少的匹配。
常见的贪婪模式 .* 匹配任意多个任意字符,非贪婪就在贪婪模式中的*或+后面加?即可。

可以发现贪婪模式尽可能多的匹配结果,非贪婪模式则匹配到第一个结果后就直接返回结果
在这里插入图片描述

常用函数

re.match()

用于从源字符串的起始位置匹配一个模式,如果匹配成功则返回匹配的结果,否则返回None,匹配成功后可以使用.span()返回在源字符串中的位置

re.match(pattern,string,flag)

  • pattern:匹配的表达式
  • string:源字符串
  • flag:标志位,可以填写模式修正符

该方法的局限性是只能从起始位置开始匹配
在这里插入图片描述

re.search()

用于匹配源字符串是否含有与模式相同的子串,如果匹配成功则返回匹配的结果,否则返回None,匹配成功后可以使用.span()返回在源字符串中的位置

re.search(pattern,string,flag)

  • pattern:匹配的表达式
  • string:源字符串
  • flag:标志位,可以填写模式修正符

该方法可以匹配整个字符串,但只会返回第一次出现的位置
在这里插入图片描述

全局匹配函数

re.complie()对正则表达式进行预编译,完成后使用findall()找出所有匹配结果
在这里插入图片描述

re.sub()

根据正则表达式来实现替换某些字符串
re.sub(pattern,rep,string,max)

  • pattern:正则表达式
  • rep:替换后留下的字符串
  • string:用于被替换的字符串
  • max:最多替换的次数,不填就会全部替换
    在这里插入图片描述

Cookie介绍

通常来说,我们都是通过HTTP协议访问网页的,HTTP协议一种无状态协议(不能维持会话间的状态);
在HTTP协议中我们登录一个网站后又退出了该网站,就需要重新登录,为了解决该问题引入了cookie和session。

  • cookie将所有的会话信息保存在客户端,当我们登录后重新访问同一个网页时会从cookie中读取会话信息来判断会话状态,如是否已经登录
  • seesion将所有会话信息存在服务器段,服务器端会给客户端发sessionID等信息,这些信息一般存在cookie中,需要用都的时候从cookie中读取

cookie处理——cookiejar

cookie处理思路:

  • 导入cookie处理模块http.cookiejar
  • 使用http.cookiejar.CookieJar()创建CookieJar对象
  • 使用HTTPCookieProcesscer创建cookie处理器,并将其作为参构建opener对象
  • 创建全局默认opener对象
    创建好之后打开本地文件中的网页就会登录成功,不会像之前爬取下来的页面没有登录(太复杂了就不累述了)
发布了85 篇原创文章 · 获赞 158 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/Late_whale/article/details/104584320