一、BeautifulSoup是什么?
1. 使用BeautifulSoup可以解析和提取网页中的数据。
1)解析数据:我们平时使用浏览器上网,浏览器会把服务器返回来的HTML源代码翻译为我们能看懂的样子,之后我们才能在网页上做各种操作。而在爬虫中,也要使用能读懂html的工具,才能提取到想要的数据。这就是解析数据。
2)提取数据:是指把我们需要的数据从众多数据中挑选出来。
2.安装BeautifulSoup:
BeautifulSoup不是Python标准库,需要单独安装它。你需要在终端单击开始-运行-输入cmd- 输入一行代码:pip install BeautifulSoup4。(Mac电脑需要输入pip3 install BeautifulSoup4)
二、BeautifulSoup怎么用?
1.用BeautifulSoup解析数据
bs对象= BeautifulSoup( 要解析的文本,‘解析器’)
要解析的文本必须是字符串,我们要用的是一个Python内置库:html.parser。(它不是唯一的解析器,但是比较简单的)
1)根据之前所学的requests.get(),我们可以先获取到一个Response对象,并确认自己获取成功:
import requests#调用requests库
res=requests.get('https://localprod.pandateacher.com/python-manuscript/crawler-html/spider-men5.0.html')#获取网页源代码,得到的res是response对象
print(res.status_code)#检查请求是否正确响应
html=res.text#把res的内容以字符串的形式返回
print(html)#打印html
2)接下来就轮到BeautifulSoup登场解析数据了,请特别留意第2行和第6行新增的代码:
import requests
from bs4 import BeautifulSoup#引入BS库res=requests.get('https://localprod.pandateacher.com/python-manuscript/crawler-html/spider-men5.0.html')
html=res.text
soup=BeautifulSoup(html,'html.parser')#把网页解析为BeautifulSoup对象
3)虽然response.text和soup打印出的内容表面上看长得一模一样,却有着不同的内心,它们属于不同的类:<class 'str'> 与<class 'bs4.BeautifulSoup'>。前者是字符串,后者是已经被解析过的BeautifulSoup对象。之所以打印出来的是一样的文本,是因为BeautifulSoup对象在直接打印它的时候会调用该对象内的str方法,所以直接打印 bs 对象显示字符串是str的返回结果。
我们之后还会用BeautifulSoup库来提取数据,如果这不是一个BeautifulSoup对象,我们是没法调用相关的属性和方法的。
用BeautiflSoup解析数据就是这关键的两行代码:
from bs4 import BeautifulSoup
soup=BeautifulSoup(字符串,'html.parser')
2. 用BeautifulSoup提取数据
1)find():只提取首个满足要求的数据。
2)find_all():提取出的是所有满足要求的数据。
括号中的参数:标签和属性可以任选其一,也可以两个一起使用,这取决于我们要在网页中提取的内容。
3)通过标签提取:
import requests
from bs4 import BeautifulSoup
url = 'https://localprod.pandateacher.com/python-manuscript/crawler-html/spder-men0.0.html'
res = requests.get (url)
print(res.status_code)
soup = BeautifulSoup(res.text,'html.parser')
item = soup.find('div') #使用find()方法提取首个<div>元素,并放到变量item里。
print(type(item)) #打印item的数据类型
print(item) #打印item
4) 通过属性提取:
import requests # 调用requests库
from bs4 import BeautifulSoup # 调用BeautifulSoup库
res = requests.get('https://localprod.pandateacher.com/python-manuscript/crawler-html/spider-men5.0.html')# 返回一个Response对象,赋值给res
html = res.text# 把Response对象的内容以字符串的形式返回
soup = BeautifulSoup( html,'html.parser') # 把网页解析为BeautifulSoup对象
items = soup.find_all(class_='books') # 通过匹配标签和属性提取我们想要的数据
print(items) # 打印items
print(type(items)) #打印items的数据类型
# 数据类型是<class 'bs4.element.ResultSet>, 前面说过可以把它当做列表list来看待。
#列表并不是我们最终想要的东西,我们想要的是列表中的值,所以要想办法提取出列表中的每一个值。
#用for循环遍历列表,就可以把这三个<div>元素取出来了。
for item in items:
print('想找的数据都包含在这里了:\n',item) # 打印item
我们一般会选择用type()函数查看一下数据类型,因为Python是一门面向对象编程的语言,只有知道是什么对象,才能调用相关的对象属性和方法。
print(type(item))
我们看到它们的数据类型是<class 'bs4.element.Tag'>,是Tag对象,不知道你是否还记得,这与find()提取出的数据类型是一样的。
3) Tag类对象的常用属性和方法:
import requests# 调用requests库
from bs4 import BeautifulSoup# 调用BeautifulSoup库
res = requests.get('https://localprod.pandateacher.com/python-manuscript/crawler-html/spider-men5.0.html')# 返回一个response对象,赋值给reshtml=res.text# 把res解析为字符串
html = res.text# 把Response对象的内容以字符串的形式返回
soup = BeautifulSoup(html,'html.parser')# 把网页解析为BeautifulSoup对象
items = soup.find_all(class_='books')# 通过匹配属性class='books'提取出我们想要的元素
for item in items:# 遍历列表
itemsfind = 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)# 打印书籍的类型、名字、链接和简介的文字
运行以上代码,我们就可以完成解析数据和提取数据的工作了。
每个网页都有自己的结构,我们写爬虫程序,还是得坚持从实际出发,具体问题具体分析。
三、操作对象的转换过程
1. 从最开始用requests库获取数据,到用BeautifulSoup库来解析数据,再继续用BeautifulSoup库提取数据,不断经历的是我们操作对象的类型转换。如图:
我们的操作对象从URL链接到了Response对象。
然后沿这条路:Response对象——字符串——BS对象。
后来又产生了两条分岔:一条是BS对象——Tag对象;另一条是BS对象——列表——Tag对象。
2. 在BeautifulSoup中,不止find()和find_all(),还有select()也可以达到相同目的。