1、Beautiful Soup的简介
Beautiful Soup是python的一个库,最主要的功能是从网页抓取数据,官方解释如下:
- Beautiful Soup提供一些简单的、python式的函数用来处理导航、搜索、修改分析树等功能。它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简单,所以不需要多少代码就可以写出一个完整的应用程序。
- Beautiful Soup自动将输入文档转换为Unicode编码,输出文档转换为utf-8编码。你不需要考虑编码方式,除非文档没有指定一个编码方式,这时,Beautiful Soup就不能自动识别编码方式了。然后,你仅仅需要说明一下原始编码方式就可以了。
- Beautiful Soup已成为和lxml一样出色的python解释器,为用户灵活地提供不同的解析策略或强劲的速度。
GitHub地址:https://beautifulsoup.readthedocs.io/zh_CN/v4.4.0/
和lxml一样,BeautifulSoup也是一个HTML/XML的解析器,主要功能也是如何解析和提取HTML/XML数据。
lxml只会局部遍历,而BeautifulSoup是基于HTML DOM的,会载入整个文档,解析整个DOM树,因此时间和内存开销都会很大,所以性能要低于lxml BeautifulSoup用来解析HTML比较简单,支持CSS选择器,Python标准库中的HTML解析器,也支持lxml的XML解析器。
BeautifulSoup安装 pip install bs4
2、解析工具对比
抓取工具 | 速度 | 使用难度 |
---|---|---|
正则 | 最快 | 困难 |
lxml | 快 | 简单 |
BeautifulSoup | 慢 | 最简单 |
3、BeautifulSoup的基本使用
# 导入
from bs4 import BeautifulSoup
# 创建Beautiful Soup对象
soup = BeautifulSoup(res.text, 'html.parser')
# 格式化输出 soup 对象的内容
print(soup.prettify())
4、解析器
解析器 | 使用方法 | 优势 | 劣势 |
---|---|---|---|
Python标准库 | BeautifulSoup(markup, “html.parser”) | 1. Python的内置标准库 2.执行速度适中 3.文档容错能力强 | Python 2.7.3 or 3.2.2)前 的版本中文档容错能力差 |
lxml HTML 解析器 | BeautifulSoup(markup, “lxml”) | 1.速度快 2.文档容错能力强 | 需要安装C语言库 |
html5lib 解析器 | BeautifulSoup(markup, “html5lib”) |
5、搜索文档树
5.1 find 和 find_all两个搜索方法
find:搜索满足要求的第一个tag,返回的是一个tag对象
find_all:寻找所有满足要求的标签,返回的是一个结果集合
5.2 相关参数
attrs={“属性”: “属性值”,….}
limit=3 只搜索前3个符合要求的tag
5.3 取值
无论是获取属性值,还是获取文本,以下方法都只能用在tag对象,不可用在resultset对象中;
(1)获取属性值:
取值方法 | 代表意义 | 区别 |
---|---|---|
a[“href”] | 取出a标签中的href属性值 | a标签中无href属性时,报错 |
a.get(“href”) | 取出a标签中的href属性值 | a标签中无href属性时,返回None |
a.attrs[“href”] | 取出a标签中的href属性值 | a标签中无href属性时,报错 |
(2)获取内容文本:
取值方法 | 代表意义 | 区别 |
---|---|---|
title.string | 取出title标签中的文本 | 当title中的文本数为1个时(空格,换行符也占一个文本数),返回该文本的字符串,否则返回None(为0,大于2时),空格和换行符连着时,只返回换行符,相当于一个文本 |
title.text | 取出title标签中的文本 | 依次返回title元素中的所有文本的字符串(包含子元素中的文本,空格,换行符,空字符串),空格和换行符连着时,只返回换行符 |
title.strings | 取出title标签中的文本 | 依次返回title元素中的所有文本的生成器(包含子元素中的文本,空格,换行符,空字符串),空格和换行符连着时,只返回换行符,需要使用list强制类型转换为列表 |
title.stripped_strings | 取出title标签中的文本 | 依次返回title元素中的所有纯文本的生成器(不包含空格,换行符,空字符串),需要使用list强制类型转换为列表 |
5.4 select与CSS常用选择器介绍
select 与find_all 一样 返回的是ResultSet对象;
select一般是结合css选择器来使用,前端知识需要多一些;
通过标签名查找
print(soup.select('a'))
通过类名查找
print(soup.select('.sister')) # 查找class=sister的标签
通过id查找
print(soup.select("#link1")) # 查找id=link1的标签
组合查找
组合查找,和写css样式时一样的,标签名与类名、id名进行的组合原理是一样的,例如查找 p 标签中,id 等于 link1的内容,二者需要用空格分开:
print(soup.select("p #link1"))
直接子标签查找,则使用 > 分隔:
print(soup.select("head > title"))
通过属性查找,class有多个属性值时适用
print(soup.select('a[href="http://example.com/elsie"]'))
5.5 练习
from bs4 import BeautifulSoup
html_doc = """
<table class="tablelist" cellspacing="0" cellpadding="0">
<tbody>
<tr class="h">
<td class="1" width="374">职位名称</td>
<td>职位类别</td>
<td>人数</td>
<td>地点</td>
<td>发布时间</td>
</tr>
<tr class="even">
<td class="l"><a href="https://www.baidu.com">区块链高级研发工程师</a></td>
<td class="l">技术类</td>
<td class="l">1</td>
<td class="l">深圳</td>
<td class="l">2018-11-25</td>
</tr>
<tr>
<td><a href="https://www.qq.com">金融云高级后台开发</a></td>
<td>技术类</td>
<td>2</td>
<td>深圳</td>
<td>2018-11-24</td>
</tr>
<tr>
<td><a href="https://www.juran.com">高级研发工程师</a></td>
<td>技术类</td>
<td>2</td>
<td>深圳</td>
<td>2018-11-24</td>
</tr>
<tr>
<td><a href="https://www.python.com">高级图像算法工程师</a></td>
<td>技术类</td>
<td>2</td>
<td>深圳</td>
<td>2018-11-24</td>
</tr>
<tr>
<td><a href="https://www.lg.com" id="test" class="test">高级业务运维工程师</a></td>
<td>技术类</td>
<td>2</td>
<td>深圳</td>
<td>2018-11-24</td>
</tr>
</tbody>
</table>
"""
soup = BeautifulSoup(html_doc, 'lxml')
# 1.获取所有tr标签
# 2.获取第2个tr标签
# 3.获取所有class等于even的tr标签
# 4.将所有id等于test,class也等于test的a标签提取出来
# 5.获取所有的a标签的href属性
# 6.获取所有的职位信息(纯文本)
6、BeautifulSoup4四大对象种类
BeautifulSoup4将复杂HTML文档转换成一个复杂的树形结构,每个节点都是Python对象,所有对象可以归纳为4种:
- Tag
- NavigableString
- BeautifulSoup
- Comment