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的基本使用

  1. # 导入
  2. from bs4 import BeautifulSoup
  3. # 创建Beautiful Soup对象
  4. soup = BeautifulSoup(res.text, 'html.parser')
  5. # 格式化输出 soup 对象的内容
  6. 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:寻找所有满足要求的标签,返回的是一个结果集合类似列表,可以遍历;不可以直接取值,需遍历后再取值,取值后得到的是tag对象

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选择器来使用,前端知识需要多一些;

  • 通过标签名查找

    1. print(soup.select('a'))
  • 通过类名查找

    1. print(soup.select('.sister')) # 查找class=sister的标签
  • 通过id查找

    1. print(soup.select("#link1")) # 查找id=link1的标签
  • 组合查找

组合查找,和写css样式时一样的,标签名与类名、id名进行的组合原理是一样的,例如查找 p 标签中,id 等于 link1的内容,二者需要用空格分开:

  1. print(soup.select("p #link1"))
  • 直接子标签查找,则使用 > 分隔:

    1. print(soup.select("head > title"))
  • 通过属性查找,class有多个属性值时适用

    1. print(soup.select('a[href="http://example.com/elsie"]'))

5.5 练习

  1. from bs4 import BeautifulSoup
  2. html_doc = """
  3. <table class="tablelist" cellspacing="0" cellpadding="0">
  4. <tbody>
  5. <tr class="h">
  6. <td class="1" width="374">职位名称</td>
  7. <td>职位类别</td>
  8. <td>人数</td>
  9. <td>地点</td>
  10. <td>发布时间</td>
  11. </tr>
  12. <tr class="even">
  13. <td class="l"><a href="https://www.baidu.com">区块链高级研发工程师</a></td>
  14. <td class="l">技术类</td>
  15. <td class="l">1</td>
  16. <td class="l">深圳</td>
  17. <td class="l">2018-11-25</td>
  18. </tr>
  19. <tr>
  20. <td><a href="https://www.qq.com">金融云高级后台开发</a></td>
  21. <td>技术类</td>
  22. <td>2</td>
  23. <td>深圳</td>
  24. <td>2018-11-24</td>
  25. </tr>
  26. <tr>
  27. <td><a href="https://www.juran.com">高级研发工程师</a></td>
  28. <td>技术类</td>
  29. <td>2</td>
  30. <td>深圳</td>
  31. <td>2018-11-24</td>
  32. </tr>
  33. <tr>
  34. <td><a href="https://www.python.com">高级图像算法工程师</a></td>
  35. <td>技术类</td>
  36. <td>2</td>
  37. <td>深圳</td>
  38. <td>2018-11-24</td>
  39. </tr>
  40. <tr>
  41. <td><a href="https://www.lg.com" id="test" class="test">高级业务运维工程师</a></td>
  42. <td>技术类</td>
  43. <td>2</td>
  44. <td>深圳</td>
  45. <td>2018-11-24</td>
  46. </tr>
  47. </tbody>
  48. </table>
  49. """
  50. soup = BeautifulSoup(html_doc, 'lxml')
  51. # 1.获取所有tr标签
  52. # 2.获取第2个tr标签
  53. # 3.获取所有class等于even的tr标签
  54. # 4.将所有id等于test,class也等于test的a标签提取出来
  55. # 5.获取所有的a标签的href属性
  56. # 6.获取所有的职位信息(纯文本)

6、BeautifulSoup4四大对象种类

BeautifulSoup4将复杂HTML文档转换成一个复杂的树形结构,每个节点都是Python对象,所有对象可以归纳为4种:

  • Tag
  • NavigableString
  • BeautifulSoup
  • Comment

7、遍历文档树

7.1 contents和children

  • contents 返回所有子节点的列表
  • children 返回所有子节点的迭代器