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'])