BeautifulSoup 美味的汤
学习一时爽,一直学习一直爽!
Hello,大家好,我是Connor,一个从无到有的技术小白。上一次我们说到了 Xpath
的使用方法。Xpath
我觉得还是比较绕该怎么办呢???有没有更加简单易懂的方法呢?答案是肯定的,当然有更加简单易懂的方法了,那就是 BeautifulSoup
美味的汤。这个方法对于正则和 Xpath
来说更加的简单方便,更加易懂,能够节省我们大量的分析时间。
1.BeautifulSoup 的简介
BeautifulSoup是一个HTML数据提取库。几乎没有什么数据可以难住BeautifulSoup。只要是你可以获取的到的数据,那么你都可以通过BeautifulSoup简单快捷的进行数据提取。是一款非常适合新手入门使用的数据提取库。当然,作为一个HTML数据提取库,requests
都有了官方中文文档,那么 BeautifulSoup
当然也不能少啊,你可以访问 BeautifulSoup
的官方中文文档:点我走起 >>>
2.BeautifulSoup 的安装
既然我又来说到安装了,那就证明这个库和我们平常想的库不太一样,它具体的安装方法为:
pip install beautifulsoup4
注意,是beautifulsoup4,并不是beautifulsoup,虽然我们beautifulsoup的叫,但人家实际叫beautifulsoup4,一定要记清楚哈。

3.BeautifulSoup 的基础使用
安装完了,下面我们就正式开始使用,老规矩,我们先来一段html文档,然后逐一举例,来看BeautifulSoup如何使用:
首先我们来随意编写一段html代码:
html = """
<html>
<head>
<title>Hello,Wrold</title>
</head>
<body>
<div class="book">
<span><!--这里是注释的部分--></span>
<a href="https://www.baidu.com">百度一下,你就知道</a>
<img src="https://abc.jpg" />
<p class="abc">这是一个示例</p>
</div>
</body>
</html>"""
3.1 简单的使用
在进行内容提取之前,我们需要将获取的html内容转换成BeautifulSoup对象:
In [1]: from bs4 import BeautifulSoup
In [2]: soup = BeautifulSoup(html, "html5lib")
In [3]: type(soup)
Out[3]: bs4.BeautifulSoup
可以看的到,我们生成的对象是一个 bs4.BeautfulSoup
对象,我们所有的内容提取都基于这个对象。切记进行内容提取之前先生成 bs4.BeautifulSoup
对象。
3.2 解析器的使用
在上面的语句中,大家可以看到我们使用了一个 html5lib
这是一个解析器,在构造BeautifulSoup
对象的时候,需要用到解析器。BeautifulSoup
支持python自带的解析器和少数第三方解析器。详细对比如下:
解析器 | 使用方法 | 优势 | 劣势 |
---|---|---|---|
Python标准库 | BeautifulSoup(html,"html.parser") |
Python的内置标准库。 执行速度适中。 文档容错能力强。 | Python 3.2.2前的版本文档容错能力差 |
lxml HTML 解析器 | BeautifulSoup(html, "lxml") |
速度快文档容错能力强 | 需要安装C语言库 |
lxml XML 解析器 | BeautifulSoup(html, ["lxml","xml"]) BeautifulSoup(html, "xml") |
速度快 唯一支持XML的解析器 | 需要安装C语言库 |
html5lib | BeautifulSoup(markup,"html5lib") |
最好的容错性 以浏览器的方式解析文档生成HTML5格式的文档 | 速度慢但不依赖外部扩展 |
一般来说,对于速度或性能要求不太高的话,还是建议大家使用 html5lib
来进行解析的,但是当规模达到一定程度的时候,解析速度就会影响到整体项目的快慢了,所以如果你对性能有要求的话,还是推荐使用 lxml
来进行解析的。具体的视情况而定吧。
3.3 节点对象
BeautifulSoup将复杂的HTML文档转换成了一个树状的结构,每个节点都是一个Python对象,所有的对象都可以归纳为四类:Tag
,NavigableString
,BeautifulSoup
,Commnet
。
3.3.1 Tag 对象
Tag
就是我们平时所说的标签,Tag下拥有许多属性和方法,和前端类似,例如 a 标签一定会有它的href属性,某些属性是某些标签所独有的。下面我们来看一下如何提取一个 Tag
对象:
In [1]: soup = BeautifulSoup(html)
In [2]: tag = soup.p
In [3]: type(tag)
Out[3]: bs4.element.Tag
可以看的到,我们生成了一个 Tag
对象,我们再来看看 Tag
对象有哪些属性:
- name属性:
每一个tag标签都有name属性
In [4]: tag.name
Out[4]: 'p'
- Attributes
在html中,某个 Tag
可能有多个属性, Tag
属性使用和字典一样的方法取值:
In [5]: tag["class"]
Out[5]: ['abc']
如果某个 Tag
属性有多个值,那么返回的是一个列表:
In [6]