> 文章列表 > day2-csv和Bs4

day2-csv和Bs4

day2-csv和Bs4

day2-csv和Bs4

一、csv文件的读写操作

1.什么是csv文件:

csv文件叫做:逗号分隔值文件,像Excel文件一样以行列的形式保存数据,保存数据的时候同一行的多列数据用逗号隔开。

2. csv文件的读写操作

1)csv文件读操作

from csv import reader, DictReader

a.reader

创建根据文件对象创建对应的reader,获取文件内容

from csv import reader, DictReader
with open('files/电影.csv', encoding='utf-8', newline='') as f:r1 = reader(f)print(next(r1))print(list(r1))

b.DictReader

with open('files/电影.csv', encoding='utf-8', newline='') as f:r2 = DictReader(f)print(next(r2))for x in r2:print(x)

2)写操作

from csv import writer, DictWriter

a. writer

with open('files/student1.csv', 'w', encoding='utf-8', newline='') as f:# 1.根据文件对象创建writer对象w1 = writer(f)# 2.写入数据# 1)一次写一行w1.writerow(['姓名', '性别', '年龄'])w1.writerow(['小明', '男', 22])# 2)一次写多行w1.writerows([('小花', '女', 18),['张三', '男', 30]])

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({'姓名': '小明', '性别': '男', '年龄': 22})w2.writerows([{'姓名': '小花', '性别': '女', '年龄': 17},{'姓名': '小红', '性别': '女', '年龄': 18},{'姓名': '张三', '性别': '男', '年龄': 30}])

二、bs4

bs4(beautifulsoup4),它基于css选择器的网页解析器

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标签4. 子代选择器	-	将两个选择器用>连接成一个选择器(前后形成父子关系)div>a{}	-	选中所有在div标签中的a标签(a标签必须是div的子标签)5. 后代选择器 	-	将两个选择器用空格连接成一个选择器(前后形成后代关系)div a{}	-	选中所有在div标签中的a标签(a标签必须是div的后代标签)

注意:安装的时候装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选择器选中的第一个标签

# 获取整个网页中的P标签返回一个列表
result = soup.select('p')
print(result)
# 获取整个网页中的第一个标签,返回值是标签对象
result = soup.select_one('p')
print(result)
#
result = soup.select('div p')
print(result)
# 获取box1中的所有标签
box1 = soup.select_one('#box1')
result = box1.select('p')
print(result)p1 = soup.select_one('span>p')
a1 = box1.select_one('a')
  1. 获取标签内容和标签属性

    标签对象.text - 获取标签内容

    标签对象.attrs[属性名] - 获取标签指定属性的值

    print(p1.text)      # '我是段落5'
    print(a1.text)      # '我是超链接3'
    print(a1.attrs['href'])     # 'https://www.baidu.com'
    

作业

day2-csv和Bs4

def page_one():div_list = soup.select('.content__list>div')for x in div_list:adrass = x.select('.content__list--item--des>a')adrass1 = []for i in adrass:adrass1.append(i.text)# print(adrass1)other = x.select('.content__list--item--des')other_message = []for i1 in other:print(i1)other_message.append(i1.text.strip())print(other_message)prince = x.select_one('.content__list--item-price').textprint(prince)
page_one()print(i1)other_message.append(i1.text.strip())print(other_message)prince = x.select_one('.content__list--item-price').textprint(prince)
page_one()