赞
踩
import re
# s为待匹配的数据
s = "apple price is $22, banana price is $33"
# 需求--匹配到价格$22 $33
# .+匹配出换行符以外任意数量字符
# 一个括号就是一个分组
result = re.search(r'.+(\$\d+).+(\$\d+)',s)
print(result.group(0))
print(result.group(1))
print(result.group(2))
print(result.groups())
分组 把你要进行二次过滤得到数据用括号括起来
print(result.group(0)) 获取整个字符串
print(result.group(1)) 匹配第一个分组 $22
print(result.group(2)) 匹配第二个分组 $33
print(result.groups()) (‘$22’, ‘$33’) 把所有得到的分组放到元组里面统一返回
结果:
apple price is $22, banana price is $33
$22
$33
(‘$22’, ‘$33’)
1 通过创建writer对象,主要用到2个方法。一个是writerow,写入一行。另一个是writerows写入多行 2
使用DictWriter 可以使用字典的方式把数据写入进去
with open(‘存储或者读取类型(Excel,csv等)’, ‘w’, encoding=‘utf-8’, newline=‘’) as file_obj:
newline = ‘’ 为了防止换行写入
1、每次写入一行
首先通过csv.writer创建writer对象
再写入表头
最后通过循环利用writer.writerows§写入数据----writer.writerow()用于单行写入
import csv
# person 数据
person = [('xxx', 18, 180), ('yyy', 20, 182), ('zzz', 22, 181)]
# header 表头
header = ['name', 'age', 'height']
# 第一种写入方式
with open('person3.csv', 'w', encoding='utf-8', newline='') as file_obj:
# newline = '' 为了防止换行写入
# 通过创建writer对象,主要用到2个方法。一个是writerow,写入一行。另一个是writerows写入多行
# 1、通过csv.writer创建writer对象
writer = csv.writer(file_obj)
# 2、写表头
writer.writerow(header)
# 3、写入数据(每次写入一行)
for p in person:
print(p)
# 第一轮循环:p = ('xxx', 18, 180)
# 第二轮循环:p = ('yyy', 20, 182)
# 第三轮循环:p = ('zzz', 22, 181)
writer.writerow(p)
2、多行写入
首先通过csv.writer创建writer对象
再写入表头
最后通过循环利用writer.writerows(person)写入数据----writer.writerows()用于多行写入
import csv
# person 数据
person = [('xxx', 18, 180), ('yyy', 20, 182), ('zzz', 22, 181)]
# header 表头
header = ['name', 'age', 'height']
# 第一种写入方式
with open('person3.csv', 'w', encoding='utf-8', newline='') as file_obj:
# newline = '' 为了防止换行写入
# 通过创建writer对象,主要用到2个方法。一个是writerow,写入一行。另一个是writerows写入多行
# 1、通过csv.writer创建writer对象
writer = csv.writer(file_obj)
# 2、写表头
writer.writerow(header)
# 3、写入数据(一次写入多行)
writer.writerows(person)
当数据格式为字典格式时,可以使用第二种写入方式
首先通过csv.DictWriter创建dic对象
再写入表头,因为创建对象里面已传入表头,写入表头时不需要再传表头
最后通过循环利用writer.writerows(person)写入数据----writer.writerows()用于多行写入
import csv
# person 数据
person = [('xxx', 18, 180), ('yyy', 20, 182), ('zzz', 22, 181)]
# header 表头
header = ['name', 'age', 'height']
# persons 字典格式数据
persons = [
{'name': 'xxx', 'age': 20, 'height': 180},
{'name': 'yyy', 'age': 20, 'height': 180},
{'name': 'zzz', 'age': 20, 'height': 180},
]
# 第二种写入方式(字典)
with open('person4.csv', 'w', encoding='utf-8', newline='') as file_obj:
# 创建DictWriter对象
dic = csv.DictWriter(file_obj, header)
# 写入表头
dic.writeheader()
# 写入数据 注意数据的格式(需要是字典)
dic.writerows(persons)
1、通过reader()读取到的每一条数据是一个列表。可以通过下标的方式获取具体某一个值
2、通过DictReader()读取到的数据是一个字典。可以通过Key值(列名)的方式获取数据
首先通过csv.reader创建reader对象
如果直接通过print(对象)读取出的对象像是#<_csv.reader object at 0x00000230FE508F28>
则直接通过循环遍历对象再输出数据
import csv
# 第一种读取数据
with open('person2.csv', 'r', encoding='utf-8') as file_obj:
# 创建读取对象reader
reader = csv.reader(file_obj)
# 读取对象
# print(reader)#<_csv.reader object at 0x00000230FE508F28>
for r in reader:
print(r)
print(r[0]) #获取name数据
print(r[1]) #获取age数据
print(r[2]) #获取height数据
import csv
# 第二种读取
with open('person2.csv', 'r', encoding='utf-8') as file_obj:
# 创建读取对象reader
reader = csv.DictReader(file_obj)
# 读取对象
# print(reader)
# <csv.DictReader object at 0x000001DA45CE9708>
for r in reader:
print(r)
print(r['name']) #获取name数据
print(r['age']) #获取age数据
print(r['height']) #获取height数据
爬取天气预报里一周的天气信息
案例网址:天气预报
案例代码:
import re
import csv
import requests
'''
一天的天气情况数据是放在一个li标签里面的
七天数据,也就是在七个li标签里面是放在同一个ul标签里面的
'''
# 目标url
url = "http://www.weather.com.cn/weather/10121050108A.shtml"
# 请求头
header = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36"
}
# 创建响应对象
res = requests.get(url, headers=header)
# 通过res响应对象获取网页源码
html = res.content.decode('utf-8')
# print(html)
# 用正则网页源代码里面获取匹配数据
# result 有七天数据
result = re.search(r'<ul class="t clearfix">.*?</ul>', html, re.S)
# print(result.group())
li_list1 = re.findall(r'<li class=.*?>.*?</li>', result.group(), re.S)
li_list2 = re.findall(r'<li>.*?</li>', result.group(), re.S)
li_list1.extend(li_list2)
# print(li_list1)
data = []
for li in li_list1:
# print(li)
result_1 = re.search(
r'.*?<h1>(.*?)</h1>.*?<p title=.*? class=.*?>(.*?)</p>.*?<i>(.*?)</i>.*?<span title=(.*?) class=.*?></span>.*?<i>(.*?)</i>.*?',
li, re.S)
'''
result_1.group(1) 日期
result_1.group(2) 天气情况
result_1.group(3) 最低温度
result_1.group(4) 风向
result_1.group(5) 风级
'''
# 匹配到的数据,也可以通过group()下标索引
print(result_1.groups())
# print(result_1.group(1), result_1.group(2), result_1.group(3)
import re
import csv
import requests
# 目标url
url = "http://www.weather.com.cn/weather/10121050108A.shtml"
# 请求头
header = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36"
}
# 创建响应对象
res = requests.get(url, headers=header)
# 通过res响应对象获取网页源码
html = res.content.decode('utf-8')
result = re.search(r'<ul class="t clearfix">.*?</ul>', html, re.S)
# print(result.group())
li_list1 = re.findall(r'<li class=.*?>.*?</li>', result.group(), re.S)
li_list2 = re.findall(r'<li>.*?</li>', result.group(), re.S)
li_list1.extend(li_list2)
# print(li_list1)
data = []
for li in li_list1:
# print(li)
result_1 = re.search(
r'.*?<h1>(.*?)</h1>.*?<p title=.*? class=.*?>(.*?)</p>.*?<i>(.*?)</i>.*?<span title=(.*?) class=.*?></span>.*?<i>(.*?)</i>.*?',
li, re.S)
one_day = result_1.groups()
data.append(one_day)
# print(data)
header = ['日期', '天气情况', '最低温度', '风向','风级']
with open("weather1.csv", 'w', encoding='utf-8', newline='') as file_obj:
writer = csv.writer(file_obj)
writer.writerow(header)
writer.writerows(data)
import re
import csv
import requests
'''
一天的天气情况数据是放在一个li标签里面的
七天数据,也就是在七个li标签里面是放在同一个ul标签里面的
'''
# 目标url
url = "http://www.weather.com.cn/weather/10121050108A.shtml"
# 请求头
header = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36"
}
# 创建响应对象
res = requests.get(url, headers=header)
# 通过res响应对象获取网页源码
html = res.content.decode('utf-8')
# print(html)
# 用正则网页源代码里面获取匹配数据
# result 有七天数据
result = re.search(r'<ul class="t clearfix">.*?</ul>', html, re.S)
# print(result.group())
li_list1 = re.findall(r'<li class=.*?>.*?</li>', result.group(), re.S)
li_list2 = re.findall(r'<li>.*?</li>', result.group(), re.S)
li_list1.extend(li_list2)
# print(li_list1)
data = []
for li in li_list1:
# print(li)
item = {}
result_1 = re.search(
r'.*?<h1>(.*?)</h1>.*?<p title=.*? class=.*?>(.*?)</p>.*?<i>(.*?)</i>.*?<span title=(.*?) class=.*?></span>.*?<i>(.*?)</i>.*?',
li, re.S)
item['日期'] = result_1.group(1)
item['天气情况'] = result_1.group(2)
item['最低温度'] = result_1.group(3)
item['风向'] = result_1.group(4)
item['风级'] = result_1.group(5)
# print(item)
data.append(item)
'''
result_1.group(1) 日期
result_1.group(2) 天气情况
result_1.group(3) 最低温度
result_1.group(4) 风向
result_1.group(5) 风级
'''
# 匹配到的数据,也可以通过group()下标索引
# print(result_1.groups())
# print(result_1.group(1), result_1.group(2), result_1.group(3), result_1.group(4),result_1.group(5))
# print('-' * 100)
# one_day存储一天天气
# one_day = result_1.groups()
# data.append(one_day)
# # print(data)
header = ['日期', '天气情况', '最低温度', '风向', '风级']
# with open("weather1.csv", 'w', encoding='utf-8', newline='') as file_obj:
# writer = csv.writer(file_obj)
# writer.writerow(header)
# writer.writerows(data)
# 字典写入时表头要和字典里面key需要一一对应
with open("weather2.csv", 'w', encoding='utf-8', newline='') as file_obj:
writer = csv.DictWriter(file_obj, header)
writer.writeheader()
writer.writerows(data)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。