其他分享
首页 > 其他分享> > re模块、爬虫、openpyxl模块

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里下载

image

image

image

image

pip 命令的语法格式

pip install|uninstall|list 模块名
命令参数 含义
install 用于安装第三方模块,当 pip 使用 install 作为参数时,后面的模块名不能省略
uninstall 用于卸载已经安装的第三方模块,选择 uninstall 作为参数时,后面的模块名也不能省略
list 用于显示已经安装的第三方模块

下载的地址(源地址)

pip工具默认是从国外的仓库地址下载模块,下载速度很慢

切换下载地址:

语法命令格式:

pip3.8 install 模块名 -i 源地址

pycharm提供第三方模块下载快捷方式,也可以直接修改python解释器源文件

下载报错

  1. pip工具版本过低,直接拷贝提示信息里面的更新命令即可

    python38 -m pip install --upgrade pip
    
  2. 网络波动,关键字Read timed out

    • 解决办法:重新下载几次或切换
  3. 有些模块在下载使用之前需要提前配置指定的环境(结合具体情况,百度搜素)

注意:模块也有版本

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底层操作表格的模块

基本概念

Workbook:就是一个 excel 工作簿,其中包含多个 sheet

Sheet:工作簿中的一张表页

Cell:就是简单的一个单元格,用来存储数据对象

excel版本问题

下载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')  # # 保存文件

image

作业

# 尝试将红牛分公司数据保存到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')

image

标签:匹配,openpyxl,res,re,模块,print,findall
来源: https://www.cnblogs.com/NianBai/p/16499422.html