day3-csvAndBs4
作业补充
# 1. re模块
from re import fullmatch, findall, search, split, sub, finditer, match
# 2. 正则语法
# 1)匹配类型
# 普通符号、.、\d、\s、\w、\D、\S、\W、[字符集]、[^字符集]
# 2)匹配次数
# *、+、?、{N}、{M,N}、{M,}、{,N}
# *?、+?、??、{M,N}?、{M,}?、{,N}?
# 3)分组 - ()
# 整体操作、重复(\M)、捕获
# 4)分之 - |
# 正则1|正则2
# 5)转义符号
# 6)检测类符号:是在匹配成功的时候,检测所在的位置是否符合要求
# \b - 检测是否是单词边界(任何可以将不同的单词进行区分的符号:空白符号、标点符号、字符串开头、字符串结尾)
# ^ - 检测是否是字符串开头
# $ - 检测是否是字符串结尾
from re import fullmatch, findall
print(fullmatch(r'abc\s\b123', 'abc 123'))
msg = '238jshs90睡觉睡觉2838,换手89,100 还是说78世界上78, 628.829=sjs好几家899'
result = findall(r'\b\d+', msg)
print(result)
result = findall(r'^\d+', msg)
print(result)
result = findall(r'\d+$', msg)
print(result)
# 补充:
# 6)检测类符号:是在匹配成功的时候,检测所在的位置是否符合要求
# \b - 检测是否是单词边界(任何可以将不同的单词进行区分的符号:空白符号、标点符号、字符串开头、字符串结尾)
# ^ - 检测是否是字符串开头
# $ - 检测是否是字符串结尾
一、 csv读写操作
-
什么是csv文件
-
csv文件的读写操作
1)csv文件读操作
a.reader
from csv import reader,DictReader # 根据文件对象创建一个对应的reader,获取文件内容 # newline - 行和行之间的分割方式 with open('files/电影.csv',encoding='utf-8',newline='') as f: r1 = reader(f) print(r1) print(next(r1)) print(list(r1))
b.DictReader
from csv import reader,DictReader with open('files/电影.csv',encoding='utf-8',newline='') as f: r2 = DictReader(f) print(r2) print(next(r2)) for i in r2: print(i)
2)csv文件写操作
a.writer
from csv import writer,DictWriter with open('files/student1.csv','w',encoding='utf-8',newline='') as f: # 1.根据文件对象创建一个writer对象 w1 = writer(f) # 2.写入数据 # 1)一次写一行 w1.writerow(['姓名','性别','年龄']) # 2)一次写多行【内容可以是元组】 w1.writerows([ ['小吴','女','11'], ['小敏','女','18'] ])
b.DictWriter
with open('files/student2.csv','w',encoding='utf-8',newline='') as f: # 1.根据文件对象创建一个writer对象 w2 = DictWriter(f,['姓名','性别','年龄']) # 2.写入数据 # 1)将字典的键作为第一行内容写入文件 w2.writeheader() w2.writerow({'姓名':'小吴','性别': '女', '年龄': '21'}) w2.writerows([ {'姓名': '小敏', '性别': '女', '年龄': '19'}, {'姓名': '小爷', '性别': '女', '年龄': '23'}, {'姓名': '小叶', '性别': '女', '年龄': '22'} ])
二、bs4
css语法:
选择器{属性名1: 属性值2; 属性名2: 属性值2; …}
常见属性:color(设置字体颜色)、 background-color(背景颜色)、font-size(字体大小)、width(宽度)、height(高度)、border(边框)
选择器:
- 元素选择器(标签选择器) - 将标签作为选择器,选中所有指定的标签
a{} - 选中所有的a标签
p{} - 选中所有的p标签
span{} - 选中所有的span标签 - id选择器 - 在标签的id属性前加#作为一个选择器,选中id属性值为指定值的标签
注意:一个网页中id属性值是唯一的
#a{} - 选中id属性值为a的标签
#b1{} - 选中id属性值为b1的标签 - class选择器 - 在标签的class属性前加.作为一个选择器,选中所有class属性值为指定值的标签
注意:一个网页中多个标签的class属性值可以相同;同一个标签可以有多个不同的class
只有一个class属性值标签的写法:<标签名 class=“c1”>
有多个class属性值标签的写法:<标签名 class=“c1 c2 c3”>
.a{} - 选中class属性值为a标签
.c1{} - 选中class属性值为c1的标签
.a.b{} - 选中class属性值同时为a和b标签
a.c1{} - 选中所有class值为c1的a标签
-
子代选择器 - 将两个选择器用>连接成一个选择器(前后形成父子关系)
div>a{} - 选中所有在div标签中的a标签(a标签必须是div的子标签) -
后代选择器 - 将两个选择器用空格连接成一个选择器(前后形成后代关系)
div a{} - 选中所有在div标签中的a标签(a标签必须是div的后代标签)
# bs4(beautifulsoup4),它基于css选择器的网页解析器
# 注意:安装的时候装beautifulsoup4,使用的时候用bs4
from bs4 import BeautifulSoup
# 1. 根据网页源代码创建soup对象: BeautifulSoup(网页源代码, 'lxml')
f = open('files/data.html', encoding='utf-8')
soup = BeautifulSoup(f.read(), 'lxml')
f.close()
# 2. 获取标签
# soup对象.select(css选择器) - 获取整个网页中选择器选中的所有标签,返回值是一个列表,列表中的元素是标签对象(找不到返回空列表)
# soup对象.select_one(css选择器) - 获取整个网页中选择器选中的第一个标签,返回值是标签对象(找不到返回None)
# 标签对象.select(css选择器) - 获取指定标签中css选择器选中的所有标签
# 标签对象.select_one(css选择器) - 获取指定标签中css选择器选中的第一个标签
result = soup.select('p')
print(result)
# result = soup.select('.c1')
# print(result)
#
# result = soup.select_one('p')
# print(result)
#
# result = soup.select('div p')
# print(result)
box1 = soup.select_one('#box1')
result = box1.select('p')
print(result)
p1 = soup.select_one('span>p')
a1 = box1.select_one('a')
# 3. 获取标签内容和标签属性
# 标签对象.text - 获取标签内容
# 标签对象.attrs[属性名] - 获取标签指定属性的值
print(p1.text) # '我是段落5'
print(a1.text) # '我是超链接3'
print(a1.attrs['href']) # 'https://www.baidu.com'
三、bs4豆瓣
import requests
from bs4 import BeautifulSoup
# 1. 获取网页源代码
headers = {
'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36'
}
response = requests.get('https://movie.douban.com/top250', headers=headers)
html = response.text
# 2. 解析数据
soup = BeautifulSoup(html, 'lxml')
# 获取每个电影对应的div
div_list = soup.select('.grid_view>li>div')
for x in div_list:
name = x.select_one('.title').text
score = x.select_one('.rating_num').text
comment = x.select('.star>span')[-1].text[:-3]
print(name, score, comment)
四、豆瓣作业
import csv
import requests
from re import findall
def get_one_page(start=0):
# 1. 获取网页数据
url = f'https://movie.douban.com/top250?start={start}&filter='
headers = {
'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36'
}
response = requests.get(url, headers=headers)
html = response.text
# print(html)
# 2. 解析数据
# 1)所有电影的名字
names = findall(r'<img width="100" alt="(.+?)"', html)
# 2)所有电影的上映时间、国家和类型
info = findall(r'(?s)<p class="">(.+?)</p>', html)
info = [x.strip().split('\n')[-1].strip() for x in info]
times = []
countries = []
types = []
for x in info:
result = x.split(' / ')
times.append(result[0])
countries.append(result[1])
types.append(result[2])
# 3)评分
score = findall(r'<span class="rating_num" property="v:average">(.+?)</span>', html)
# 4)评论人数
comment = findall(r'<span>(\d+)人评价</span>', html)
data = map(lambda i1, i2, i3, i4, i5, i6: (i1, i2, i3, i4, i5, i6), names, score, comment, times, countries, types)
# 将数据保存到csv文件中
w2.writerows(data)
print('-------------------------------一页获取完成-----------------------')
def get_one_page2():
# 1. 获取网页数据
url = 'https://movie.douban.com/top250?start=0&filter='
headers = {
'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36'
}
response = requests.get(url, headers=headers)
html = response.text
# print(html)
# 2. 解析数据
result = findall(r'(?s)<img width="100" alt="(.+?)".+?<p class="">(.+?)</p>.+?<span class="rating_num" property="v:average">(.+?)</span>.+?<span>(\d+)人评价</span>', html)
print(result)
from datetime import datetime
from csv import writer
if __name__ == '__main__':
f = open('files/top250.csv', 'w', encoding='utf-8', newline='')
w2 = writer(f)
w2.writerow(['电影名称', '评分', '评论人数', '上映时间', '国家', '类型'])
for x in range(0, 226, 25):
get_one_page(x)
f.close()