爬虫系列二(数据清洗--->正则表达式)

时间:2023-03-09 09:36:37
爬虫系列二(数据清洗--->正则表达式)

一 正则常识

模式 描述
\w 匹配字母数字及下划线
\W 匹配非字母数字及下划线

\s

匹配任意空白字符,等价于 [\t\n\r\f].
\S 匹配任意非空字符
\d 匹配任意数字,等价于 [0-9]
\D 匹配任意非数字
\A 匹配字符串开始
\Z 匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串
\z 匹配字符串结束
\G 匹配最后匹配完成的位置
\n 匹配一个换行符
\t 匹配一个制表符
^ 匹配字符串的开头
$ 匹配字符串的末尾
. 匹配任意字符,除了换行符
[...] 用来表示一组字符,单独列出:[amk] 匹配 'a','m' 或 'k'
[^...] 不在 [] 中的字符:[^abc]匹配除了 a,b,c 之外的字符。
* 匹配 0 个或多个的表达式。
+ 匹配 1 个或多个的表达式。
? 匹配 0 个或 1 个由前面的正则表达式定义的片段,非贪婪方式
{n} 精确匹配 n 个前面表达式。
{n, m} 匹配 n 到 m 次由前面的正则表达式定义的片段,贪婪方式
a \| b 匹配 a 或 b
( ) 匹配括号内的表达式,也表示一个组

二 pythoon正则中的常见方法

函数 描述
re.match(pattern, string, flags=0) 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none
re.search(pattern, string, flags=0) 扫描整个字符串并返回第一个成功的匹配
re.sub(pattern, repl, string, count=0) 用于替换字符串中的匹配项,repl : 替换的字符串,也可为一个函数
re.compile(pattern[, flags]) 用于编译正则表达式,生成一个正则表达式( Pattern )对象,供 match() 和 search() 这两个函数使用
findall(string[, pos[, endpos]]) 在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表
re.split(pattern, string[, maxsplit=0, flags=0]) 能够匹配的子串将字符串分割后返回列表

三 修饰符总结

修饰符 描述
re.I 使匹配对大小写不敏感
re.L 做本地化识别(locale-aware)匹配
re.M 多行匹配,影响 ^ 和 $
re.S 使 . 匹配包括换行在内的所有字符
re.U 根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B.
re.X 该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。

四 爬虫正则解析数据实例(源码)

# re 解析,下载嗅事百科图片

import requests
import re
import os url='https://www.qiushibaike.com/pic/'
headers={
'user-agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.20 Safari/537.36'
} response=requests.get(url=url,headers=headers)
# print(response.text) '''
#网页中需要的数据格式为:
<div class="thumb"> <a href="/article/121553539" target="_blank">
<img src="//pic.qiushibaike.com/system/pictures/12155/121553539/medium/8FN1C2RZMV2J1FJY.jpg" alt="抖音上的骗子">
</a> </div>
''' #利用re获取图片url
ex='<div class="thumb">.*?<img src="(?P<img>.*?)" alt.*?</div>'
img_url_list=re.findall(ex,response.text,re.S) #持久化保存图片
if not os.path.exists('qiushibaike'):
os.makedirs('qiushibaike') for url in img_url_list:
url='https:'+url
img_data=requests.get(url=url).content
img_name=url.split('/')[-1]
path='qiushibaike/'+img_name
with open(path,mode='wb') as f:
f.write(img_data)
print(img_name+'下载完成')