re模块、爬虫、openpyxl模块
作者:互联网
re模块
re模块是python独有的匹配字符串的模块,该模块中提供的很多功能是基于正则表达式实现的,而正则表达式是对字符串进行模糊匹配,提取自己需要的字符串部分,他对所有的语言都通用。
re.findall方法
简介
在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果有多个匹配模式,则返回元组列表,如果没有找到匹配的,则返回空列表
语法
re.findall(pattern, string, flags=0)
参数说明
参数 | 描述 |
---|---|
pattern | 匹配的正则表达式 |
string | 要匹配的字符串 |
flags | 标志位,用于控制正则表达式的匹配方式(是否区分大小写、多行匹配等) |
实例
import re
res = re.findall('a', 'jason oscar aaa') # 返回所有满足匹配条件的结果,放在列表里
res2 = re.findall('a', 'kevin lili tom')
print(res) # ['a', 'a', 'a', 'a', 'a']
print(res2) # []
findall的优先级查询
re.findall针对分组的正则表达式匹配到的结果,优先展示
re.findall也能够取消分组优先展示(?:)
import re
res1 = re.findall('abc', 'abcabcabcabc')
print(res1) # ['abc', 'abc', 'abc', 'abc']
res2 = re.findall('a(b)c', 'abcabcabcabc')
print(res2) # ['b', 'b', 'b', 'b']
# 取消分组优先展示 (?:)
res3 = re.findall('a(?:b)c', 'abcabcabcabc')
print(res3) # ['abc', 'abc', 'abc', 'abc']
re.finditer方法
简介
re.finditer与re.findall作用一致,只不过结果会被处理成迭代器对象,用于节省内存
语法
re.finditer(pattern, string, flags=0)
参数说明
参数 | 描述 |
---|---|
pattern | 匹配的正则表达式 |
string | 要匹配的字符串 |
flags | 标志位,用于控制正则表达式的匹配方式(是否区分大小写、多行匹配等) |
匹配对象方法
匹配对象方法 | 描述 |
---|---|
group(num=0) | 匹配的整个表达式的字符串,group() 可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组 |
groups() | 返回一个包含所有小组字符串的元组,从 1 到 所含的小组号 |
实例
import re
res = re.finditer('a', 'jason oscar aaa') # finditer返回一个存放匹配结果的迭代器
print(res) # <callable_iterator object at 0x000001337ED45588>
print(next(res).group()) # 查看第一个结果 a
print(next(res).group()) # 查看第二个结果 a
print([i.group() for i in res]) # 查看剩余的左右结果 ['a', 'a', 'a']
re.search方法
简介
re.search 通过正则表达式匹配到一个符合条件的内容就结束
语法
re.search(pattern, string, flags=0)
参数说明
参数 | 描述 |
---|---|
pattern | 匹配的正则表达式 |
string | 要匹配的字符串 |
flags | 标志位,用于控制正则表达式的匹配方式(是否区分大小写、多行匹配等) |
匹配对象方法
匹配对象方法 | 描述 |
---|---|
group(num=0) | 匹配的整个表达式的字符串,group() 可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组 |
groups() | 返回一个包含所有小组字符串的元组,从 1 到 所含的小组号 |
实例
import re
res = re.search('a', 'jason oscar aaa')
res2 = re.search('a', 'food juice')
print(res) # <_sre.SRE_Match object; span=(1, 2), match='a'>
print(res2) # None
print(res.group()) # a
别名
import re
res = re.search('a(?P<id>b)(?P<name>c)', 'abcabcabcabc')
print(res.group()) # abc
print(res.group(1)) # b
print(res.group('id')) # b
print(res.group('name')) # c
re.match方法
简介
re.match 通过正则表达式从头开始匹配,如果头部已经不符合,那么后面就不走了,match() 就返回 none
语法
re.match(pattern, string, flags=0)
参数说明
参数 | 描述 |
---|---|
pattern | 匹配的正则表达式 |
string | 要匹配的字符串 |
flags | 标志位,用于控制正则表达式的匹配方式(是否区分大小写、多行匹配等) |
匹配对象方法
匹配对象方法 | 描述 |
---|---|
group(num=0) | 匹配的整个表达式的字符串,group() 可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组 |
groups() | 返回一个包含所有小组字符串的元组,从 1 到 所含的小组号 |
实例
import re
res = re.match('a', 'jason oscar aaa') # 同search,不过是在字符串开始处进行匹配
res2 = re.match('a', 'angle angry')
print(res) # None
print(res2) # <_sre.SRE_Match object; span=(0, 1), match='a'>
print(res2.group()) # a
re.compile方法
简介
re.compile能够提前准备好正则,之后可以反复使用,减少代码冗余
实例
import re
obj = re.compile('a')
print(re.findall(obj, 'asjd23sadasf3234ap342l')) # ['a', 'a', 'a', 'a']
print(re.findall(obj, 'sssdadwfh455weaw2433ga')) # ['a', 'a', 'a']
print(re.findall(obj, 'aasdgrwe23425hdsqaae1a')) # ['a', 'a', 'a', 'a', 'a']
第三方模块
简介
第三方模块是别人写好的,具有特定功能的模块,我们需要下载才可以使用
下载和安装第三方模块,可以使用 Python 提供的 pip 命令实现。
下载方式
方式一:Python 提供的 pip 命令实现 pip install 模块名==版本号
方式二:pycharm内在settings里下载
pip 命令的语法格式
pip install|uninstall|list 模块名
命令参数 | 含义 |
---|---|
install | 用于安装第三方模块,当 pip 使用 install 作为参数时,后面的模块名不能省略 |
uninstall | 用于卸载已经安装的第三方模块,选择 uninstall 作为参数时,后面的模块名也不能省略 |
list | 用于显示已经安装的第三方模块 |
下载的地址(源地址)
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/
语法命令格式:
pip3.8 install 模块名 -i 源地址
pycharm提供第三方模块下载快捷方式,也可以直接修改python解释器源文件
下载报错
-
pip工具版本过低,直接拷贝提示信息里面的更新命令即可
python38 -m pip install --upgrade pip
-
网络波动,关键字Read timed out
- 解决办法:重新下载几次或切换
-
有些模块在下载使用之前需要提前配置指定的环境(结合具体情况,百度搜素)
注意:模块也有版本
pip3.8 install 模块名==版本号
pip3.8 install django==1.11.11
网络爬虫
简介
互联网:将全世界的计算机连接到一起组成的网络
互联网发明的目的:将接入互联网的计算机上面的数据彼此共享
上网的本质:基于互联网访问别人计算机上面的资源(有些计算机存在的意义就是让别人访问,这种类型的计算机我们也称之为服务器)
爬虫:一段自动抓取互联网信息的程序,从互联网上抓取对于我们有价值的信息
网络爬虫的本质:模拟计算机浏览器朝目标网址发送请求回去数据并筛选,只要是浏览器可以访问到的数据网络爬虫理论上都可以
爬取公司信息
# 获取红牛分公司数据 http://www.redbull.com.cn/about/branch
import requests
# 朝目标地址发送网络请求获取响应数据(相当于在浏览器地址栏中输入网址并回车)
# res = requests.get('http://www.redbull.com.cn/about/branch')
# print(res.content) # 获取bytes类型的数据
# print(res.text) # 获取解码之后的数据
# 为了避免每次执行程序都要发送网络请求 也可以提前保存页面数据到文件
# with open(r'hn.html','wb') as f:
# f.write(res.content)
import re
# 读取页面数据
with open(r'hn.html', 'r', encoding='utf8') as f:
data = f.read()
# 研究目标数据的特征 编写正则筛选
# 1.获取所有的分公司名称
company_name_list = re.findall('<h2>(.*?)</h2>', data)
# print(res)
# 2.获取所有的分公司地址
company_addr_list = re.findall("<p class='mapIco'>(.*?)</p>", data)
# print(company_addr_list)
# 3.获取所有的分公司邮箱
company_email_list = re.findall("<p class='mailIco'>(.*?)</p>", data)
# print(company_email_list)
# 4.获取所有的分公司电话
company_phone_list = re.findall("<p class='telIco'>(.*?)</p>", data)
# print(company_phone_list)
# 5.将上述四个列表中的数据按照位置整合
res = zip(company_name_list, company_addr_list, company_email_list, company_phone_list)
# 6.处理数据(展示 保存 excel)
for i in res: # ('红牛杭州分公司', '杭州市上城区庆春路29号远洋大厦11楼A座', '310009', '0571-87045279/7792')
print("""
公司名称:%s
公司地址:%s
公司邮箱:%s
公司电话:%s
""" % i)
openpyxl模块
简介
openpyxl 是一个用于处理 xlsx 格式 Excel 表格文件的第三方 python 库,其支持 Excel 表格绝大多数基本操作。主要用于操作excel表格,也是pandas底层操作表格的模块
- openpyxl属于近几年比较流行的模块,openpyxl针对03版本之前的excel文件兼容性不好
- xlwt、xlrd也可以操作excel表格,兼容所有版本的excel文件,但是使用方式没有openpyxl简单
基本概念
Workbook:就是一个 excel 工作簿,其中包含多个 sheet
Sheet:工作簿中的一张表页
Cell:就是简单的一个单元格,用来存储数据对象
excel版本问题
- 03版本之前 excel文件的后缀名 .xls
- 03版本之后 excel文件的后缀名 .xlsx
- 苹果电脑excel文件的后缀 .csv
下载openpyxl模块
方式一:Python 提供的 pip 命令实现
pip install openpyxl
方式二:pycharm内在settings里下载(详见第三方模块知识里的图)
openpyxl实操
# 1.创建excel文件
from openpyxl import Workbook # 导入模块
wb = Workbook() # 创建excel文件
wb1 = wb.create_sheet('烧烤表')
wb2 = wb.create_sheet('炸鸡表')
wb3 = wb.create_sheet('奶茶表', 0)
wb1.title = '火锅表' # 支持二次修改
wb1.sheet_properties.tabColor = "1072BA" # 修改工作簿颜色
wb.save(r'666.xlsx') # 保存文件
# 2.写入数据
# 第一种写入方式
wb1['A1'] = '清汤火锅'
wb1['D2'] = '牛油火锅'
# 第二种写入方式
wb1.cell(row=3, column=2, value='鸳鸯锅')
# 第三种写入方式(批量写入)
wb1.append(['火锅种类', '价格', '数量', '种类'])
wb1.append(['牛杂火锅', 666, 1, '牛杂'])
wb1.append(['牛腩火锅', 777, 2, '牛腩'])
wb1.append(['清汤火锅', 555, 1, '清汤'])
wb1.append(['牛油火锅', 444, 1, '牛油'])
wb1.append(['乌鸡火锅', 333, 8, '乌鸡'])
wb1.append([None, 123, 18])
wb1['F11'] = '=sum(B5:B10)'
wb.save(r'666.xlsx') # # 保存文件
作业
# 尝试将红牛分公司数据保存到excel表格中
import requests
import re
from openpyxl import Workbook
# 向目标地址发送网络请求获取响应数据
res = requests.get('http://www.redbull.com.cn/about/branch')
print(res.content) # 获取bytes类型的数据
print(res.text) # 获取解码之后的数据
# 为了避免每次执行程序都要发送网络请求 提前保存页面数据到文件
with open(r'hn.html', 'wb') as f:
f.write(res.content)
with open(r'hn.html', 'r', encoding='utf8') as f:
data = f.read()
# 获取所有的分公司名称
company_name_list = re.findall('<h2>(.*?)</h2>', data)
# 获取所有的分公司地址
company_addr_list = re.findall("<p class='mapIco'>(.*?)</p>", data)
# 获取所有的分公司邮箱
company_email_list = re.findall("<p class='mailIco'>(.*?)</p>", data)
# 获取所有的分公司电话
company_phone_list = re.findall("<p class='telIco'>(.*?)</p>", data)
res = zip(company_name_list, company_addr_list, company_email_list, company_phone_list)
wb = Workbook() # 创建excel文件
wb1 = wb.create_sheet('红牛分公司数据表')
wb1.append(['分公司名称', '分公司地址', '分公司邮箱', '分公司电话'])
for i in res:
wb1.append(i)
wb.save(r'hndata.xlsx')
标签:匹配,openpyxl,res,re,模块,print,findall 来源: https://www.cnblogs.com/NianBai/p/16499422.html