re模块
re模块使用
- python中使用正则表达式,re模块是其中之一的一种选择
import re # 开始使用re模块时先导入re模块
- 导入模块后可以开始进行操作
-
- findall 通过正则表达式筛选出文本中所有符合条件的数据。
res = re.findall('x', 'zxxxqeexxxwqesxs') print(res) # 打印后以列表的形式展现- 输出结果
-
- finditer 与fine作用一致不过会将筛选的结果处理为迭代器对象节省内存。
res = re.finditer('x', 'zxxxqeexxxwqesxs') print(res) # 打印后输出的是一串位置信息- 输出结果
-
- search 通过正则表达式匹配到一个符合条件的内容就结束
res = re.search('x', 'zxxxqeexxxwqesxs') print(res) print(res.group()) # group()用来提出分组截获的字符串- 输出结果
-
- match 通过正则表达式匹配到一个开头符合条件的内容结束,开头不符合就不在匹配
res = re.match('x', 'zxxxqeexxxwqesxs') print(res) # 内容开头为z res = re.match('x', 'xxxqeexxxwqesxs') print(res) # 内容开头为x- 输出结果
-
- compile 提前准备好正则,后续可以反复使用·,减少代码冗余
res1 = re.compile('x') print(re.findall(res1, 'qew4sdsdsaasx')) print(re.findall(res1, 'wdwqaxvdsbdbx')) print(re.findall(res1, 'xxwsdsxxxssdx'))- 输出结果
-
re模块补充
-
- re模块的分组
- 分组前和分组后的对比
- findall针对分组的正则表达式匹配到的结果会优先展示
# 分组前 res = re.findall('xxs', 'nsxxsnsxxsnsxxs') print(res) # 输出结果:['xxs', 'xxs', 'xxs'] # 分组后 res = re.findall('x(x)s', 'nsxxsnsxxsnsxxs') print(res) # 输出结果:['x', 'x', 'x']- findall使用(?:)也能取消分组的优先展示
res = re.findall('x(?:x)s', 'nsxxsnsxxsnsxxs') print(res) # 输出结果:['xxs', 'xxs', 'xxs'] - 正则索引分组机制:组号从1开始,从左向右,组号依次加1
# res = re.search('x(x)s', 'xxsxxsxxs') # print(res.group()) # xxs # print(res.group(0)) # xxs 索引0是整个正则匹配到的内容 # print(res.group(1)) # x 索引1是分组里面匹配到的内容
-
- re模块的别名
- 为分组起别名
res = re.search('a(?P<id>b)(?P<name>c)', 'abcabcabcabc') print(res.group()) # abc print(res.group(1)) # b 索引到分组1为b print(res.group('id')) # b 通过命名引用分组 print(res.group('name')) # c
第三方模块下载
- 第三方模块下载所需要知道的
-
- 第三方模块必须先下载才可以导入使用
-
- python下载第三方模块需要借助pip工具
-
- 下载命令为
pip3.8 install 模块名 # 3.8是解释器版本
-
- 下载中可能会遇到的问题
-
- 下载速度很慢
# pip工具默认使用的是国外仓库地址进行模块的下载,所以速度很慢 切换下载源: 清华大学 :https://pypi.tuna.tsinghua.edu.cn/simple/ 阿里云:http://mirrors.aliyun.com/pypi/simple/ 中国科学技术大学 :http://pypi.mirrors.ustc.edu.cn/simple/ 华中科技大学:http://pypi.hustunique.com/ 豆瓣源:http://pypi.douban.com/simple/ 腾讯源:http://mirrors.cloud.tencent.com/pypi/simple 华为镜像源:https://repo.huaweicloud.com/repository/pypi/simple/ # 可以在cmd中打开python解释器 输入指令: pip3.8 install 模块名 -i 源地址 * 当然pycharm也提供了第三方模块下载的快捷方式 * 也可以直接修改python解释器源文件 -
- 下载报错
1. pip 工具版本过低,直接拷贝提示信息里面的更新命令即可 python38 -m pip install -- upgrade pip 3. 网络波动,看见关键字 Read timed out 多试几次,或者切换稳定的网络进行尝试 5. 有些模块的下载使用需要配置特定的环境 询问度娘 -
- 模块的版本
pip3.8 install 模块名==版本号 例: pip3.8 install django==1.11.11
-
网络爬虫
- 什么是互联网?
- 由全世界计算机连接到一起组成的网络
- 互联网发明的目的?
- 将接入互联网的计算机上面的数据进行共享
- 上网的本质?
- 基于互联网访问别人计算机上面的资源(开放资源访问的计算机我们一般叫做服务器)
- 网络爬虫的本质?
- 模拟计算机浏览器朝目标网址发送请求,返回数据并筛选
- 只要是浏览器可以访问到的数据网络爬虫理论上都可以
爬虫实操
- 爬取红牛分公司的数据
http://www.redbull.com.cn/about/branch
# # 1.使用requests模块
# import requests
# # requests模块会朝目标地址发送网络请求获取响应数据 相当于在浏览器地址栏输入地址访问
# res = requests.get('http://www.redbull.com.cn/about/branch')
# print(res.content) # 获取到的网页数据是bytes的类型的
# # print(res.text) # 需要将字节bytes类型解码为文本类型(查看获取到的网页)
# # 2.可以提前将获取到的网页数据保存到文件,目的是为了避免每次执行程序都要发送网络请求
# with open(r'redrull.html', 'wb')as f:
# f.write(res.content)
# 先将网页信息保存到文件,之后对文件操作就好不用再去网络获取请求了
# # 3.添加re模块,用到正则
import re
# 4.读取获得的网页数据
with open(r'redrull.html', 'r', encoding='utf8')as f:
data = f.read()
# print(data)
# 研究目标数据的特征,编写正则表达式进行筛选
# 5.获取所有分公司的名称
company_name_list = re.findall('<h2>(.*?)</h2>', data)
# print(company_name_list)
# 6.获取所有分公司邮编
company_email_list = re.findall("<p class='mailIco'>(.*?)</p>", data)
# 7.获取所有分公司电话
company_phone_list = re.findall("<p class='telIco'>(.*?)</p>",data)
# 8.获取所有分公司地址
company_addr_list = re.findall("<p class='mapIco'>(.*?)</p>",data)
# 9.将上面获得的列表整合(拉链)
res = zip(company_name_list, company_email_list, company_phone_list, company_addr_list)
# 10.循环格式化输出获取到的列表
for i in res:
print("""
公司名称:%s
公司地址:%s
公司邮箱:%s
公司电话:%s
""" % i)
- 输出结果
openpyxl模块
- openpyxl模块主要用于操作excel表格,也是pandas底层操作表格的模块
- 拓展:python中能够操作excel表格的模块
- openpyxl 属于近几年流行的模块
- openpyxl针对03版本之前的excel文件兼容性不好
- xlwt,xlrd也可以操作excel表格
- 兼容所有版本的excel文件 但是使用方式没有openpyxl简单
- openpyxl 属于近几年流行的模块
- 模块的下载
pip3.8 install openpyxl
- excel版本问题:
03版本之前 excel文件的后缀名 .xls
03版本之后 excel文件的后缀名 .xlsx
如果是苹果电脑excel文件的后缀 .csv
openpyxl模块实操
### 1.创建excel表格
# 导入模块
from openpyxl import Workbook # Workbook是创建表格的固定语法
wb = Workbook()
# 可以在excel表格里面创建多个工作簿
wb1 = wb.create_sheet('财务表')
wb2 = wb.create_sheet('工资单')
wb3 = wb.create_sheet('税收表')
# 还可以二次修改工作簿的名字
# wb1.title = '离职表'
# 可以修改工作薄颜色
# wb1.sheet_properties.tabColor = "00ffba"
# # 保存excel文件
# wb.save(r'111.xlsx')
### 2.写入数据
# 写入的方式可以有多种:
# 第一种:以行列的字母组合写入
wb1['B1'] = '税收'
# 第二种:使用行列名指定写入
wb1.cell(row=2, column=1, value='销售部')
# 第三种:(批量写入)
wb1.append(['部门', '税收', '盈利额', '净收入'])
wb1.append(['技术部', '66666', '520014', '400000'])
wb1.append([None, '233', '242342', '240000'])
# wb1.append([, '', '', ''])
# wb1.append(['', '', ])
# wb1.append(['', ''])
# 批量写入要注意,每栏数据一一都要对齐。
# 没有,缺失的数据用None,或者引号先占位代替,否则或报错
# 还可以进行求和
wb1['D7'] = '=sum(D4:D5)'
# 保存excel文件
wb.save(r'111.xlsx')
-
文件执行完毕后xslx内的结果
-
批量写入缺失的报错结果
作业
- 尝试将红牛分公司数据保存到excel表格中
import re
from openpyxl import Workbook
with open(r'redrull.html', 'r', encoding='utf8')as f:
data = f.read()
company_name_list = re.findall('<h2>(.*?)</h2>', data)
company_email_list = re.findall("<p class='mailIco'>(.*?)</p>", data)
company_phone_list = re.findall("<p class='telIco'>(.*?)</p>",data)
company_addr_list = re.findall("<p class='mapIco'>(.*?)</p>",data)
res = zip(company_name_list, company_email_list, company_phone_list, company_addr_list)
wb = Workbook()
wb1 = wb.create_sheet('红牛')
wb1.append(['公司名称', '公司邮箱', '公司电话', '公司地址'])
for i in res:
wb1.append(i)
wb.save(r'redrull.xlsx')
- 结果: