今天接触的是BeautifulSoup模块。听说很厉害,今天倒要见识一下啦。
认识BeautifulSoup模块
- BeautifulSoup模块是起到网页解析库的功能,帮助爬虫解析数据集提取数据。
- BeautifulSoup库目前更新到Beautiful Soup 4,由于它不是Python标准库,而是第三方库,需要单独安装它。在终端输入一下代码:
pip install BeautifulSoup4
解析数据
- 建立实例对象:bs(对象)=BeautifulSoup(要解释的文本,‘解释器’)
- 第0个参数是要被解析的文本,注意了,它必须是字符串
- 第1个参数用来标识解析器,我们要用的是一个Python内置库:html.parser。(它不是唯一的解析器,却是简单的那个)
import requests
# 引入BS库,下面的bs4就是beautifulsoup4
from bs4 import BeautifulSoup
res = requests.get('https://localprod.pandateacher.com/python-manuscript/crawler-html/spider-men5.0.html')
# 把网页解析为BeautifulSoup对象
soup = BeautifulSoup(res.text,'html.parser')
提取数据
知识点:find()与find_all(),以及Tag对象(标签对象)
- find()与find_all()是BeautifulSoup对象的两个方法,它们可以匹配html的标签和属性,把BeautifulSoup对象里符合要求的数据都提取出来。还有select()方法达到此目的,此处略过。
- 官方文档中,find()方法不止标签和属性两种:
知识点:两函数用法是一样的,区别在于它们工作量
- find()只提取首个满足要求的数据。find()方法将代码从上往下找,找到符合条件的第一个数据,不管后面还有没有满足条件的其他数据,停止寻找,立即返回
- find_all()顾名思义(find all:查找全部),提取出的是所有满足要求的数据。代码从上往下找,一直到代码的最后,把所有符合条件的数据一起打包返回。
Tag对象.pngTag对象:与find()和find_all()提取的数据类型一致。
- 在find_all()及find()提取出内容(Tag对象)后,需要对内容中的文本进一步提取。
find提取后进一步提取文本用到Tag对象的另外两种属性——Tag.text(获得标签中的值),和Tag['属性名'](获得属性值)。
重点:Tag.text提出Tag对象中的文字,用Tag['href']提取出URL。
提取数据过程中属性的变化及相应步骤
属性变化及相应步骤.png代码示例
# 调用requests库
import requests
# 调用BeautifulSoup库
from bs4 import BeautifulSoup
# 返回一个response对象,赋值给res
res =requests.get('https://localprod.pandateacher.com/python-manuscript/crawler-html/spider-men5.0.html')
# 把res解析为字符串
html=res.text
# 把网页解析为BeautifulSoup对象
soup = BeautifulSoup( html,'html.parser')
# 通过匹配属性class='books'提取出我们想要的元素
items = soup.find_all(class_='books')
# 遍历列表items
for item in items:
# 在列表中的每个元素里,匹配标签<h2>提取出数据
kind = item.find('h2')
# 在列表中的每个元素里,匹配属性class_='title'提取出数据
title = item.find(class_='title')
# 在列表中的每个元素里,匹配属性class_='info'提取出数据
brief = item.find(class_='info')
# 打印书籍的类型、名字、链接和简介的文字
print(kind.text,'\n',title.text,'\n',title['href'],'\n',brief.text)
获取、提取数据过程中用到的Response对象、bs对象及Tag对象的其他属性及方法:
- Response对象的方法:response.raise_for_status() ##检查是否响应成功。如果文件下载出错,将抛出异常。
利用try...except...语句来确保下载失败时停止:
try:
res.raise_for_status()
except Exception as exc:
print('There was a problem:%s'%(exc))
- 用select()函数在bs对象中查找元素。
- Tag对象调用getText()方法获取对象的文本或内部的HTML。类似于find_all()函数。
content = kind.getText(class_='books')
- str()函数接受元素的传递,返回字符串,包括开始标签及结束标签及该元素的文本。
- .attrs 返回一个字典,包括元素的属性(键)及属性值(值)。
Tag.attrs
#返回{‘class’:'books'}
- 通过元素的属性获取数据:
items = soup.find_all(class_='books') [0]
items.get('id')
##返回id的属性值author
服务器响应状态码
服务器响应状态码参考:
慕容小凡博客
网友评论