day3-csvAndBs4

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读写操作

  1. 什么是csv文件

  2. 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(边框)

选择器:

  1. 元素选择器(标签选择器) - 将标签作为选择器,选中所有指定的标签
    a{} - 选中所有的a标签
    p{} - 选中所有的p标签
    span{} - 选中所有的span标签
  2. id选择器 - 在标签的id属性前加#作为一个选择器,选中id属性值为指定值的标签
    注意:一个网页中id属性值是唯一的
    #a{} - 选中id属性值为a的标签
    #b1{} - 选中id属性值为b1的标签
  3. 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标签

  1. 子代选择器 - 将两个选择器用>连接成一个选择器(前后形成父子关系)
    div>a{} - 选中所有在div标签中的a标签(a标签必须是div的子标签)

  2. 后代选择器 - 将两个选择器用空格连接成一个选择器(前后形成后代关系)
    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('&nbsp;/&nbsp;')
        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()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值