一文入门Beautiful Soup4
本文中主要介绍的BeautifulSoup4,从简介、安装、解析器使用、语法介绍、遍历文档树、搜索文档树等进行了介绍,能够快速地入门。

什么是BS4
Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式
安装bs4
pip install beautifulsoup4
解析器
安装解析器
Beautiful Soup支持Python标准库中的HTML解析器,还支持一些第三方的解析器,其中一个是 lxml .根据操作系统不同,可以选择下列方法来安装lxml:
$ apt-get install Python-lxml
$ easy_install lxml
$ pip install lxml
另一个可供选择的解析器是纯Python实现的 html5lib ,html5lib的解析方式与浏览器相同,可以选择下列方法来安装html5lib:
$ apt-get install Python-html5lib
$ easy_install html5lib
$ pip install html5lib
常用解析器比较
下表列出了主要的解析器,以及它们的优缺点:
| 解析器 | 使用方法 | 优势 | 劣势 |
|---|---|---|---|
| Python标准库 | BeautifulSoup(markup, "html.parser") |
Python的内置标准库执行速度适中文档容错能力强 | Python 2.7.3 or 3.2.2)前 的版本中文档容错能力差 |
| lxml HTML 解析器 | BeautifulSoup(markup, "lxml") |
速度快文档容错能力强 | 需要安装C语言库 |
| lxml XML 解析器 | BeautifulSoup(markup, ["lxml", "xml"])``BeautifulSoup(markup, "xml") |
速度快唯一支持XML的解析器 | 需要安装C语言库 |
| html5lib | BeautifulSoup(markup, "html5lib") |
最好的容错性以浏览器的方式解析文档生成HTML5格式的文档 | 速度慢 |
语法
官方解释
Beautiful Soup是python的一个库,最主要的功能是从网页抓取数据。官方解释如下:
Beautiful Soup提供一些简单的、python式的函数用来处理导航、搜索、修改分析树等功能。它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简单,所以不需要多少代码就可以写出一个完整的应用程序。
Beautiful Soup自动将输入文档转换为Unicode编码,输出文档转换为utf-8编码。你不需要考虑编码方式,除非文档没有指定一个编码方式,这时,Beautiful Soup就不能自动识别编码方式了。然后,你仅仅需要说明一下原始编码方式就可以了。
Beautiful Soup已成为和lxml、html6lib一样出色的python解释器,为用户灵活地提供不同的解析策略或强劲的速度。
提取步骤
使用Beautiful Soup4提取HTML内容,一般要经过以下两步:
- 处理源代码生成
BeautifulSoup对象 - 使用
find_all()或者find()来查找内容
快速入门
使用的是中的一段内容
html_doc = """
<html><head><title>The Dormouse's story</title></head>
<body>
<p class="title"><b>The Dormouse's story</b></p>
<p class="story">Once upon a time there were three little sisters; and their names were
<a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>,
<a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
and they lived at the bottom of a well.</p>
<p class="story">...</p>
"""
下面👇的内容是对官网中一些案例的提炼,也是经常会使用到的方法。
导入模块
使用之前先导入模块并且指定解析器,创建beautifulsoup对象的时候指定两个参数:
from bs4 import BeautifulSoup
soup = BeautifulSoup(html_doc,'html.parser') # 1-待解析文档;2-解析器指定
如果文件是在本地,使用open方法先打开再进行解析
soup = BeautifulSoup(open('index.html'), 'html.parser')
直接输出

缩进格式化输出-prettify()
能够按照标准的缩进格式进行输出!!!
需要记住该方法,方便查阅内容

浏览结构化数据-标签
- 使用soup加上标签能够轻松获取标签相关的内容,比正则更加方便了些。
- 整个标签
- 标签名称
- 标签内容

- 如果存在多个相同的标签名,只会取到第一个

如果想查询所有的标签,往下看
- 查看相关的属性

四大对象种类
BS将HTML文档解析成一个复杂的树形结构,每个节点都可以看做是Python对象,所有对象可以归纳为4种:
- Tag
- NavigableString
- BeautifulSoup
- Comment
Tag(标签)
就是HTML中每个标签,下面就是一个完整的title、p标签
<title>The Dormouse's story</title>
<p class="title"><b>The Dormouse's story</b></p>
Tag对象与XML或者HTML原生文档中的tag相同

Tag对象的两个重要属性:name和attributes
name
- 每个tag都有自己的name。如果改变tag的name属性,那么将改变当前通过BS对象生成的HTML文档

:soup 对象本身的name值是[document],对于内部其他标签,输出的值便是标签本身的名称

attributes
对于一个tag对象可能具有多个attributes值,比如<a class="sister" href="http://example.com/lacie" id="link2">便有3个属性值。
通过字典和.[attribute]的方式能够获取到属性值

tag的属性可以进行修改、添加和删除等操作,操作方法和字典的一样。

NavigableString(可遍历的字符串)
字符串常被包含在tag内.Beautiful Soup用 NavigableString 类来包装tag中的字符串。
上面通过方法得到了标签里面的内容,那怎么得到标签内部的文字呢?很简单:通过.string方法即可

BeautifulSoup(BS对象)
BeautifulSoup 对象表示的是一个文档的全部内容.大部分时候,可以把它当作 Tag 对象
因为 BeautifulSoup 对象并不是真正的HTML或XML的tag,所以它没有name和attribute属性。
但有时查看它的 .name 属性是很方便的,所以 BeautifulSoup 对象包含了一个值为 “[document]” 的特殊属性 .name

Comment (注释)
Tag , NavigableString , BeautifulSoup 几乎覆盖了html和xml中的所有内容,但是还有一些特殊对象.容易让人担心的内容是文档的注释部分.
Comment 对象是一个特殊类型的 NavigableString 对象,其实输出的内容仍然不包括注释符号,看下面的例子:

使用之前最好先进行一个判断:
if type(soup.a.string) == bs4.element.Comment: # 如果类型一致
print(soup.a.string) # 输出文本内容
首先判断了它的类型,是否为 Comment 类型,然后再进行其他操作,如打印输出。