一、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打印出的内容表面上看长得一模一样,却有着不同的内心,它们属于不同的类:
我们之后还会用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()方法提取首个 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的数据类型 # 数据类型是 #列表并不是我们最终想要的东西,我们想要的是列表中的值,所以要想办法提取出列表中的每一个值。 #用for循环遍历列表,就可以把这三个 for item in items: print('想找的数据都包含在这里了:\n',item) # 打印item 我们一般会选择用type()函数查看一下数据类型,因为Python是一门面向对象编程的语言,只有知道是什么对象,才能调用相关的对象属性和方法。 print(type(item)) 我们看到它们的数据类型是 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')# 在列表中的每个元素里,匹配标签 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()也可以达到相同目的。
提取出数据
三、操作对象的转换过程