re模块、openpyxl模块、第三方模块下载、网络爬虫基础

re模块

在python中,如果想要使用正则表达式,re模块是选择之一,不是唯一

1.findall()、finditer()

findall()、finditer()都是通过正则表达式筛选出文本中所有符合条件的数据。findall()直接可以将符合条件的的数据值以列表的形式返回;finditer()返回的结果是一个迭代器对象,用于节省内存

import re

res = re.findall('abc','afhrabcmjabcabcjifk')
print(res)  # ['abc', 'abc', 'abc']  

res1 = re.finditer('abc','afhrabcmjabcabcjifk')
print(res1)  # <callable_iterator object at 0x00000285022174A8>
print(res1.__next__())  # <_sre.SRE_Match object; span=(4, 7), match='abc'>
print(res1.__next__())  # <_sre.SRE_Match object; span=(9, 12), match='abc'>
print(res1.__next__())  # <_sre.SRE_Match object; span=(12, 15), match='abc'>

2.search()

search()通过正则表达式匹配到一个符合条件的内容就结束,可以通过.group()的方法拿结果

import re
res = re.search('abc','afhrabcmjabcabcjifk')
print(res)  # <_sre.SRE_Match object; span=(4, 7), match='abc'>
print(res.group())  # abc

3.match()

match()通过正则表达式从头开始时匹配,如果刚开始就不符合,就直接返回None

import re
res = re.match('abc','afhrabcmjabcabcjifk')
print(res)   # None

res1 = re.match('abc','abcrabcmjabcabcjifk')
print(res1)   # <_sre.SRE_Match object; span=(0, 3), match='abc'>
print(res1.group())  # abc

4.compile()

compile()能够提前准备好正则,之后可以反复调用,可以减少代码的冗余

import re
res = re.compile('abc')
print(re.findall(res,'abcehgdkabc'))  # 'abc', 'abc']
print(re.findall(res,'shfjabcabcabcabc'))  # ['abc', 'abc', 'abc', 'abc']
print(re.findall(res,'fhrjabcjdabc'))  # ['abc', 'abc']

为正则表达式起别名、分组——( )

1.分组

findall()可以针对分组的正则表达式匹配到的结果优先展示,也可以取消优先展示——(?😃;

import re
res = re.findall('abc','afhrabcmjabcabcjifk')
print(res)  # ['abc', 'abc', 'abc']

res1 = re.findall('a(b)c','afhrabcmjabcabcjifk')
print(res1)  # ['b', 'b', 'b']

res2 = re.findall('a(?:b)c','afhrabcmjabcabcjifk')
print(res2)  # ['abc', 'abc', 'abc']

search()针对分组的表达式没有优先展示的特点,但可以通过.group(1)的方式(索引)拿到分组的结果

import re
res = re.search('abc','afhrabcmjabcabcjifk')
print(res)  # <_sre.SRE_Match object; span=(4, 7), match='abc'>
print(res.group())  # abc

res1 = re.search('a(b)c','afhrabcmjabcabcjifk')
print(res1)  # <_sre.SRE_Match object; span=(4, 7), match='abc'>
print(res1.group())  # abc
print(res1.group(0))  # abc
print(res1.group(1))  # b
print(res1.group(2))  # 报错

res2 = re.search('(a)bc','afhrabcmjabcabcjifk')
print(res2)  # <_sre.SRE_Match object; span=(4, 7), match='abc'>
print(res2.group())  # abc
print(res2.group(0))  # abc
print(res2.group(1))  # a
print(res2.group(2))  # 报错

res3 = re.search('ab(c)','afhrabcmjabcabcjifk')
print(res3)  # <_sre.SRE_Match object; span=(4, 7), match='abc'>
print(res3.group())  # abc
print(res3.group(0))  # abc
print(res3.group(1))  # c
print(res3.group(2))  # 报错

2.起别名——(?P<名字>)

import re
res1 = re.search('ab(?P<name>c)','afhrabcmjabcabcjifk')
print(res1)  # <_sre.SRE_Match object; span=(4, 7), match='abc'>
print(res1.group())  # abc
print(res1.group(1))  # c
print(res1.group('name'))  # c

网络爬虫

简介

1.互联网:将全世界的计算机连接到一起组成的网络(局域网、广域网)
2.互联网发明的目的:将接入互联网的计算机上面的数据彼此共享
3.上网的本质:基于互联网访问别人计算机上面的资源(服务器)
4.网络爬虫的本质:模拟计算机浏览器朝目标网址发送请求,进行数据爬取并筛选(只要是浏览器可以访问到的数据,网络爬虫理论上都可以)

网络爬虫的实操

爬取红牛官网上公司分布信息 http://www.redbull.com.cn/about/branch

import requests
import re
res = requests.get("http://www.redbull.com.cn/about/branch")
print(res)  # <Response [200]>  # 表示请求成功
print(res.content)  # 打印的是bytes类型的数据
print(res.text)  # 获取解码之后的数据

# 为了避免每次执行程序都要发送网络请求,可以提前保存页面数据到文件
with open(r'hn.html','w',encoding='utf8')as f:
    f.write(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 = re.findall('<h2>(.*?)</h2>',data)
print(company_name)
# 用正则表达式获取分公司地址
company_address = re.findall("<p class='mapIco'>(.*?)</p>",data)
print(company_address)
# 用正则表达式获取分公司邮箱
company_mail = re.findall("<p class='mailIco'>(.*?)</p>",data)
print(company_mail)
# 用正则表达式获取分公司电话
company_telephone_number = re.findall("<p class='telIco'>(.*?)</p>",data)
print(company_telephone_number)
# 用zip()将上面数据一一整合
company_info = zip(company_name,company_address,company_mail,company_telephone_number)

for i in company_info:
    # print(i)  # ('红牛杭州分公司', '杭州市上城区庆春路29号远洋大厦11楼A座', '310009', '0571-87045279/7792')
    print(f"""
    ***************************************************
    分公司名称:{i[0]}
    分公司地址:{i[1]}
    分公司邮箱:{i[2]}
    分公司电话:{i[3]}
    ***************************************************
    """)

第三方模块的下载

第三方模块可以通过命令行借助于pip工具或pycharm提供第三方模块下载快捷方式

1.第三方模块必须先下载才可以导入使用
2.python下载第三方模块需要借助pip工具
3.下载命令:
	3.1 pip3 install 模块名
	3.2 pip3 install 模块名==版本号

1.命令行借助于pip工具,可能出现的问题

1.下载速度慢: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 install 模块名 -i 源地址
2.下载报错
	2.1 pip工具版本过低:直接拷贝提示信息里面的更新命令即可
		eg:最后一行出现:You should consider upgrading via the 'python -m pip install --upgrade pip' command. >>>直接拷贝:python36 -m pip install --upgrade pip
	2.2 网络波动,关键字是Read timed out:只需要重新下载几次即可或者切换到网络稳定一点的地方
    2.3 有些模块在下载使用之前需要提前配置指定的环境:百度搜索
    
    	

2.pycharm提供第三方模块下载快捷方式--方法

方法:点击File —Settings—Python Interpreter—任意双击Package下的模块—在搜索模块中

1.点击File 
2.点击Settings
3.点击Python Interpreter
4.任意双击Package下的模块
5.在搜索框中输入想搜索的第三方模块名--(默认是从国外的仓库地址下载的模块,也可以切换下载地址)
6.点击Install Package
	

切换下载地址

在搜索第三方模块的页面,点击Manage Repositories—点击“+”—出现Repository URL弹窗,在下面填写源地址—点击OK即可

image

选择第三方模块的版本

image

openpyxl模块

openpyxl模块主要用于操作excel表格,也是pandas底层操作表格的模块

导入

1.在python中能够操作excel表格的模块有很多,比如:openpyxl、xlwt、xlrd
	1.1 openpyxl模块属于近几年比较流行的模块,它对03版本的excel文件兼容性不好
	1.2 xlwt、xlrd可以兼容所有版本的excel文件,但是使用没有openpyxl简单
2.excel版本
	.xls 是03版本之前的excel文件后缀名
    .xlsx 是03版本之后的excel文件后缀名
3.下载模块:pip3 instal openpyxl

openpyxl的实操

在pycharm中修改excel文件信息后,记得查看是否关闭正在修改的excel文件

1.创建excel文件和工作簿

Workbook.create_sheet()

from openpyxl import Workbook
wb = Workbook()
ws1 = wb.create_sheet('课程信息')
wb2 = wb.create_sheet("成绩表",1)  # 添加到第一个位置
wb3 = wb.create_sheet("分班信息表")
wb.save("信息表.xlsx")

2.修改excel文件的工作簿名称

Worksheet.title

from openpyxl import Workbook
wb = Workbook()
ws1 = wb.create_sheet('课程信息')
ws1.title = "分班信息"
wb.save("信息表.xlsx")

3.修改excel文件的工作簿颜色

Worksheet.sheet_properties.tabColor

from openpyxl import Workbook
wb = Workbook()
ws1 = wb.create_sheet('课程信息')
ws1.sheet_properties.tabColor = "1072BA"
wb.save("信息表.xlsx")

4.写入数据—方式一

from openpyxl import Workbook
wb = Workbook()
ws1 = wb.create_sheet('课程信息')
ws1['A1'] ='星期一'
wb.save("信息表.xlsx")

4.写入数据—方式二

Worksheet.cell()

from openpyxl import Workbook
wb = Workbook()
ws1 = wb.create_sheet('课程信息')
ws1['A1'] ='星期一'
ws1.cell(row=1, column=2, value="星期二")
wb.save("信息表.xlsx")

5.写入数据—方式三(批量写入)

from openpyxl import Workbook
wb = Workbook()
ws1 = wb.create_sheet('课程信息')
ws1.append(['星期一','星期二','星期三','星期四','星期五'])
ws1.append(['数学','java','英语','python','java'])
ws1.append(['语文','python','数学','python','java'])
ws1.append(['python','java','英语','数学','java'])
ws1.append(['语文','java','python','python','数学'])
wb.save("信息表.xlsx")

作业

尝试将红牛分公司数据保存到excel表格中 http://www.redbull.com.cn/about/branch

import requests
from openpyxl import Workbook
import re
res = requests.get("http://www.redbull.com.cn/about/branch")
with open(r'red_row.html','wb')as f:
    f.write(res.content)
with open(r'red_row.html','r',encoding='utf8')as f:
    data= f.read()
company_name = re.findall('<h2>(.*?)</h2>',data)
company_address = re.findall("<p class='mapIco'>(.*?)</p>",data)
company_mail = re.findall("<p class='mailIco'>(.*?)</p>",data)
company_telephone_number = re.findall("<p class='telIco'>(.*?)</p>",data)
company_info = zip(company_name,company_address,company_mail,company_telephone_number)
wb = Workbook()
ws1 = wb.create_sheet("红牛分公司信息表")
ws1.append(["名称","地址","邮箱","电话"])
for i in company_info:  # ('红牛杭州分公司', '杭州市上城区庆春路29号远洋大厦11楼A座', '310009', '0571-87045279/7792')
    ws1.append(i)
wb.save("红牛分公司信息表.xlsx")
posted @   DRAMA-娜娜  阅读(122)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示