BeautifulSoup库以来解析数据及提取数据,读懂html文件并且从中提取需要的数据
bs对象 = BeautifulSoup(要解析的文本[must be string],'解析器'[例如html.parser,python内置])
# 解析数据:
from bs4 import BeautifulSoup
...
html = res.text # html返回string类的值
soup = BeautifulSoup(html,'html.parser')
# soup的数据类型是<class 'bs4.BeautifulSoup'>,说明soup是一个BeautifulSoup对象
# 尽管显示出soup与html的形式一样,但是其内核不相同,html为string类,而soup是BeautifulSoup对象,如果直接打印会以str方式显示,
# 但是他作为BeautifulSoup对象,之后可以使用BeautifulSoup对象内部的属性和方法来进行对内容的调用,至此解析数据完成。
# 提取数据:
find()与find_all():
# find()与find_all()是BeautifulSoup对象的两个方法,它们可以匹配html的标签和属性,把BeautifulSoup对象里符合要求的数据都提取出来。
# 它俩的用法基本是一样的,区别在于,find()只提取首个满足要求的数据,而find_all()提取出的是所有满足要求的数据
soup = find('div',class_= 'books')
# 这里有一个下划线,是为了和python语法中的类 class区分,避免程序冲突
# soup的类型是bs4.element.Tag !!!Tag对象!!!
soup = find_all('div',class_= 'books')
# soup的类型是bs4.element.ResultSet,表示为一个列表
# 括号中的参数:标签和属性可以任选其一,也可以两个一起使用,这取决于我们要在网页中提取的内容
# 使用find_all找到数据集后可以使用for loop来读取单个标签下的数据,但是其中的数据都在tag中,于是使用Tag对象
Tag对象三种常用的属性及方法:
1. Tag.find / Tag.find_all: 提取Tag中的Tag
2. Tag.text: 提取Tag中的文字
3. Tag['属性名']: 输入参数:属性名,可以提取这个属性的值
items = soup.find_all(class_='books') # 通过匹配属性class='books'提取出我们想要的元素
for item in items: # 遍历列表items
kind = item.find('h2') # 在列表中的每个元素里,匹配标签<h2>提取出数据
title = item.find(class_='title') # 在列表中的每个元素里,匹配属性class_='title'提取出数据
brief = item.find(class_='info') # 在列表中的每个元素里,匹配属性class_='info'提取出数据
print(kind.text,'\n',title.text,'\n',title['href'],'\n',brief.text) # 打印书籍的类型、名字、链接和简介的文字
# 我们在用text获取纯文本时,获取的是该标签内的所有纯文本信息,不论是直接在这个标签内,还是在它的子标签内