day2-bs4解析器和csv文件操作

bs4解析器和csv文件操作

1. csv文件写操作

1.1 创建writer对象

csv.writer(文件对象) - 写入数据的时候一行内容对应一个列表

csv.DictWriter(文件对象, 字段名列表) - 写入数据的时候一行内容对应一个字典

import csv

# 1)使用witer
f1 = open('files/data1.csv', 'w', encoding='utf-8', newline='')
w1 = csv.writer(f1)

# 2)使用DictWriter
f2 = open('files/data2.csv', 'w', encoding='utf-8', newline='')
w2 = csv.DictWriter(f2, ['姓名', '年龄', '分数'])

1.2 写入数据

witer对象.writerow(一行数据)

writer对象.writerows(多行数据)

# 1)使用witer写入数据
w1.writerow(['姓名', '年龄', '分数'])
w1.writerow(['小马', 20, 85])
w1.writerows([
    ['小红', 21, 90],
    ['晓红', 18, 70],
    ['萧红', 23, 60]
])

# 2)使用DictWriter写入数据
# 将字段作为第一行内容
w2.writeheader()
w2.writerow({'姓名': '小红', '年龄': 20, '分数': 90})
w2.writerow({'姓名': '萧红', '年龄': 21, '分数': 95})
w2.writerows([
    {'姓名': '晓红', '年龄': 19, '分数': 80},
    {'姓名': '晓虹', '年龄': 18, '分数': 50}
])

2.练习

练习:将爬取到的贝壳租房网站上的数据保存为csv文件

import requests
from re import findall
from json import dumps
import csv

# 1. 发送请求
headers = {
    'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36'
}

response = requests.get('https://cd.zu.ke.com/zufang', headers=headers)

# 2. 获取结果
result = response.text
# print(result)

# 3.解析数据
prices = findall(r'<span class="content__list--item-price"><em>(\d+)</em>', result)
# print(prices)

areas = findall(r'(\d+\.?\d*)㎡', result)
# print(areas)

addresses = findall(r'<a target="_blank" href="/zufang/[a-z]+/">(\w+\(?\w*\)?)</a>-<a href="/zufang/[a-z]+/" target="_blank">(\w+\(?\w*\)?)</a>-<a title="(\w+\(?\w*\)?)"', result)
# print(addresses)

data = map(lambda i1, i2, i3: {'区': i3[0], '地址': '-'.join(i3), '价格': i1, '面积': i2}, prices, areas, addresses)
# print(list(data))


# with open('files/租房信息.json', 'w', encoding='utf-8') as f:
#     f.write(dumps(list(data)))

f1 = open('files/renting_info.csv', 'w', encoding='utf-8', newline='')
w1 = csv.DictWriter(f1, ['区', '地址', '价格', '面积'])

w1.writeheader()
w1.writerows(list(data))

3.csv文件读操作

创建reader

csv.reader(csv文件对象) - 每一行对应一个列表获取数据

csv.DictReader(csv文件对象) - 每一行对应一个字典获取数据

import csv

# 1)
# reader
f1 = open('files/renting_info.csv', 'r', encoding='utf-8')
r1 = csv.reader(f1)      # 迭代器
# DictReader
f2 = open('files/renting_info.csv', 'r', encoding='utf-8')
r2 = csv.DictReader(f2)

# 2)获取内容
print(next(r1))
print(list(r1))
print('--------------------------------------------这是一条分割线--------------------------------------------')

print(next(r2))
for i in r2:
    print(i)

4. html和css选择器

4.1 前端开发的三大技术

1)html - 负责给网页提供内容(通过各种各样的标签来给网页提供各种各样的内容)

2)css - 负责网页内容的样式和布局

3)js - 负责网页内容变化

4.2 html

一个网页对应一个html文件,html文件内容就可以构建一个网页。

html为网页提供内容的基本单位是标签

1)标签(元素)语法:

双标签:<标签名 属性1=属性值1 属性2=属性值2 …>标签内容</标签名>

单标签:<标签名 属性1=属性值1 属性2=属性值2 …> 或者 <标签名 属性1=属性值1 属性2=属性值2 …/>

2)常见标签

标题标签:h1 ~ h6

段落标签:p

图片:img(通过src属性来提供图片 - src属性保存的是图片的地址)

超链接:a(通过href属性提供跳转地址,通过标签内容提供可点击内容)

<!--html版本说明-->
<!DOCTYPE html>

<!--html标签代表整个网页-->
<html lang="en">
    <!--head标签控制网页顶部显示-->
    <head>
        <meta charset="UTF-8">
        <title>呜呼啦呼</title>
    </head>
    <!--body标签控制内容的显示-->
    <body>
    <h1>一级标题</h1>
    <p>《疯狂动物城》由迪士尼影业出品的3D动画片,由里奇·摩尔、拜恩·霍华德、杰拉德·布什联合执导,金妮弗·古德温、杰森·贝特曼、夏奇拉、艾伦·图代克、伊德瑞斯·艾尔巴、J·K·西蒙斯等加盟配音。</p>
    
    <a href="https://img2.doubanio.com/view/photo/s_ratio_poster/public/p480747492.webp">肖申克的救赎</a>

    <a href="https://baike.baidu.com/item/%E7%96%AF%E7%8B%82%E5%8A%A8%E7%89%A9%E5%9F%8E/18869840?fr=aladdin">
        <img src=".\files\animals.jpg" alt="" title="点击查看疯狂动物城">
    </a>

    <input type="text">
    <button>确定</button>
    <br><br>
    </body>
</html>

4.2 css选择器

css(层叠样式表,简称样式表)负责网页内容的样式和布局。

1)css代码写在哪?

a.内联样式表:将样式写在标签的style属性中

b.内部样式表:将样式写在style标签中(style标签通常放在head中)

c.外部样式表:将样式写在css文件中,然后在html文件中用link标签导入

2)css代码怎么写?

选择器{属性1: 属性值1; 属性2: 属性值2; …}

选择器 - 选中需要设置样式的标签(找标签)

3)选择器(重点!!!)

a. 元素选择器(标签选择器):直接将标签名作为选择器,选中网页中所有的指定标签

元素选择器(标签选择器):直接将标签名作为选择器,选中网页中所有的指定标签

a{} - 选中所有的a标签

p{} - 选中所有的p标签

b. class选择器:

在标签的class属性值前加.作为一个选择器,选中class属性值为指定值的标签

.c1{} - 选中所有class属性值为c1的标签

.person{} - 选中所有class属性值为person的标签

将’标签名.class属性值’结构作为一个选择器,选中所有class属性值为指定值的指定标签

p.c1{} - 选中所有class属性值为c1的p标签

a.c2{} - 选中所有class属性值为c2的超链接

将’.class属性值1.class属性值2.class属性值3…'结构作为一个选择器,选中class属性同时为指定值的标签

.c1.c1{} - 选中class属性值同时为c1, c2的标签

.c1.c1.c3{} - 选中class属性值同时为c1, c2, c3的标签

注意:不同的标签可以拥有相同的class属性值;同一个标签可以同时拥有多个不同的class属性值

c. id选择器:在id属性值前面加#作为一个选择器,选中id属性值为指定值的标签(id属性
值是唯一的)

#p1{} - 选中id属性为p1的标签

d. 子代选择器:将多个独立的选择器用>连接作为一个选择器

div>.c1{} - 选中div的子标签中所有class值为c1的标签

.c2>p{} - 选中class值为c2的标签的子标签中的所有p标签

f. 后代选择器:将多个独立的选择器用空格隔开作为一个选择器

div .c1{} - 选中div的后代标签中所有class值为c1的标签

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>疯狂动物城</title>
    <!--2.内部样式-->
    <style>
        a{color: green;}

        .c1{background-color:black; color: yellow;}

        .c1.c2.c3{border:2px solid red;}

        p.c1{font-size: 20px;}

        p.c2{color: orange; font-size: 10px;}

        #p1{font-size:30px;}

        div>.c4{color:cyan;}

        div .c4{font-size:20px;}
    </style>

    <!--3.外部样式-->
    <link rel="stylesheet" href="外部.css">

</head>
<body>
    <!--1.内联样式-->
    <p class="c2">《疯狂动物城》由迪士尼影业出品的3D动画片,由里奇·摩尔、拜恩·霍华德、杰拉德·布什联合执导,金妮弗·古德温、杰森·贝特曼、夏奇拉、艾伦·图代克、伊德瑞斯·艾尔巴、J·K·西蒙斯等加盟配音。</p>
    <a href="https://baike.baidu.com/item/%E7%96%AF%E7%8B%82%E5%8A%A8%E7%89%A9%E5%9F%8E/18869840?fr=aladdin">疯狂动物城</a>
    <span>我是span1</span>
    <a href="">我是超链接2</a>
    <p class="c1 c2 c3">我是段落2</p>
    <a href="" id="p1">我是超链接3</a>
    <span class="c1">我是span2</span>
    <p class="c1 c2">我是段落3</p>
    <hr>
    <p class="c4">我是段落4</p>
    <a href="">我是超链接4</a>
    <span>我是span3</span>
    <div>
        <p>
            <span class="c4">我是span5</span>
        </p>
        <a href="" class="c4">我是超链接5</a>
    </div>

</body>
</html>

5. bs4数据解析

注意:使用BeautifulSoup来对网页进行解析安装第三方库:beautifulsoup4,然后再通过bs4来使用这个库

0)准备网页源代码

from bs4 import BeautifulSoup
import requests

headers = {
    'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36'
}
response = requests.get('https://movie.douban.com/top250?start=0&filter=', headers=headers)
html = response.text

1)创建soup对象

BeautifulSoup(网页源代码, ‘lxml’) - 根据指定的网页源代码创建soup对象并且返回(soup对象就相当于整个网页)

soup = BeautifulSoup(html, 'lxml')

2)

a. 使用soup来使用标签

soup对象.select(css选择器) - 获取css选择器选中的所有标签,返回一个列表,列表中的元素是被选中的所有标签对象

soup对象.select_one(css选择器) - 获取css选择器选中的第一个标签,返回一个标签对象

all_a = soup.select('a')
print(all_a)

title_a = soup.select('.nav-items a')
print(title_a)

div1 = soup.select_one('#suggResult')
print(div1)

b.使用标签获取标签

标签对象.select(css选择器) - 获取指定标签中选择器选中的所有标签

标签对象.select_one(css选择器) - 获取指定标签中选择器选中的第一个标签

result = div1.select('p')
print(result)

3)获取标签内容和标签属性

a. 获取标签内容:标签对象.text

for i in title_a:
    print(i.text)

b. 获取标签属性:标签对象.attrs[属性名]

for i in title_a:
    print(i.attrs['href'])

div1)


b.使用标签获取标签

标签对象.select(css选择器)       -       获取指定标签中选择器选中的所有标签

标签对象.select_one(css选择器)       -       获取指定标签中选择器选中的第一个标签

~~~python
result = div1.select('p')
print(result)

3)获取标签内容和标签属性

a. 获取标签内容:标签对象.text

for i in title_a:
    print(i.text)

b. 获取标签属性:标签对象.attrs[属性名]

for i in title_a:
    print(i.attrs['href'])
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值