1、概述
人工智能行业的发展是以大数据为基础的,在人工智能行业当中,数据比模型本身要重要的多。从一定程度上来讲大量优质的数据可以弥补模型的缺点。而大数据所所涉及的范畴会非常的广泛,有很多在垂直行业深耕很多年的企业会积累很多的行业数据。但这种企业毕竟是少数,很多情况下我们需要自己开发爬虫从互联网上抓取数据,而爬虫程序一个非常重要的环节就是对互联网上的网页进行分析,由于网页上的资料和形式千差万别,能够从这些文档中获取自己的数据就变得尤为重要。
bs4是python库主要用于对标记语言进行分析。而在爬虫程序中使用最多的场景是分析网页文档,也就是html文档。本文重要讲解bs4的基本用法。
2、安装
可以使用下面命令在linux系统中安装beautiful soup库
pip install beautifulsoup4
同时beautiful soup4.0 在支持不同的解析器,如下表所示
解析器 | 使用方法 | 优势 | 劣势 |
---|---|---|---|
Python标准库 | BeautifulSoup(markup, "html.parser") |
|
|
lxml HTML 解析器 | BeautifulSoup(markup, "lxml") |
|
|
lxml XML 解析器 |
|
|
|
html5lib | BeautifulSoup(markup, "html5lib") |
|
|
一般情况下,我们可以通过bs4自带的标准库进行解析,如果需要可以自行安装其他的解析器,下面以html5lib为例说明安装具体命令。
pip install html5lib
3、基本应用
3.1 bs4 对象的种类
本文主要介绍bs4在解析html文档场景中的应用,对于html的基本结构这里不做赘述。在bs4解析html的应用中,文档会被解析成一个属性结构,这种解析方式与浏览器的dom树结构相似。在这个树中,每一个元素都以对象的形式存在,这些对象不论如何嵌套应用,都可以被归纳成4种。
- Tag
- NavigableString
- BeautifulSoup
- Comment
3.1.1 Tag
标签是html的主要组成,所有标记语言的节点都是以标签形式出现的。请参照如下代码:
from bs4 import BeautifulSoup
soup = BeautifulSoup('<b class="boldest">Extremely bold</b>')
tag = soup.b
type(tag)
# <class 'bs4.element.Tag'>
输出效果如下图所示
Tag有很多方法和属性,现在介绍一下tag中最重要的属性: name和attributes
1)name属性
可以通过下面代码来获取标签的属性
from bs4 import BeautifulSoup
soup = BeautifulSoup('<b class="boldest">Extremely bold</b>')
tag = soup.b
print(tag.name)
# b
通过可以通过该属性来修改标签,如果改变了tag的name,那将影响所有通过当前Beautiful Soup对象生成的HTML文档。请参考如下代码:
from bs4 import BeautifulSoup
soup = BeautifulSoup('<b class="boldest">Extremely bold</b>')
tag.name = 'a'
print(tag)
输出效果如下图所示:
2) Attributes
一个tag可能有很多个属性. tag <b class="boldest">
有一个 “class” 的属性,值为 “boldest” . tag的属性的操作方法与字典相同,请参考如下代码:
from bs4 import BeautifulSoup
soup = BeautifulSoup('<b class="boldest">Extremely bold</b>')
print(tag['class'])
# ['boldest']
也可以使用attrs可以以字典形式返回标签的所有属性,请参考如下代码:
from bs4 import BeautifulSoup
soup = BeautifulSoup('<b class="boldest">Extremely bold</b>')
print(tag.attrs)
输出效果如下图所示:
tag的属性可以被添加,删除或修改. 再说一次, tag的属性操作方法与字典一样,请参考如下代码:
tag['class'] = 'verybold'
tag['id'] = 1
tag
# <blockquote class="verybold" id="1">Extremely bold</blockquote>
del tag['class']
del tag['id']
tag
# <blockquote>Extremely bold</blockquote>
tag['class']
# KeyError: 'class'
print(tag.get('class'))
# None
3)多属性
在很多情况下,我们会给某一个属性,赋给多个值,这种情况最多的是应用在class属性上。由于class属性是设定元素的样式,而样式表本身就是“层叠式样式表“是需要叠加的,所以在class这个属性上多个属性值的情况非常常见,请参照如下代码:
css_soup = BeautifulSoup('<p class="body strikeout"></p>')
css_soup.p['class']
# ["body", "strikeout"]
如果某个属性看起来好像有多个值,但在任何版本的HTML定义中都没有被定义为多值属性,那么Beautiful Soup会将这个属性作为字符串返回,请参照如下代码:
id_soup = BeautifulSoup('<p id="my id"></p>')
id_soup.p['id']
# 'my id'
将tag转换成字符串时,多值属性会合并为一个值,请参照如下代码:
rel_soup = BeautifulSoup('<p>Back to the <a rel="index">homepage</a></p>')
rel_soup.a['rel']
# ['index']
rel_soup.a['rel'] = ['index', 'contents']
print(rel_soup.p)
# <p>Back to the <a rel="index contents">homepage</a></p>
3.1.2 NavigableString
在bs4中NavigableString代表字符串类型,字符串常被包含在tag内.Beautiful Soup用 NavigableString
类来包装tag中的字符串,请参考如下代码:
from bs4 import BeautifulSoup
soup = BeautifulSoup('<b class="boldest"><a>Extremely bold</a></b>')
tag = soup.b
print(tag.string)
print(type(tag.string))
# <class 'bs4.element.NavigableString'>
# b
输出结果如下图所示:
tag中包含的字符串不能编辑,但是可以被替换成其它的字符串,用 replace_witch() 方法:
from bs4 import BeautifulSoup
soup = BeautifulSoup('<b class="boldest"><a>Extremely bold</a></b>')
tag = soup.b
tag.string.replace_with("No longer bold")
print(tag)
输出结果如下图所示:
3.1.3 BeautifulSoup
BeautifulSoup 对象表示的是一个文档的全部内容.大部分时候,可以把它当作 Tag 对象,它支持 遍历文档树 和 搜索文档树 中描述的大部分的方法.因为 BeautifulSoup 对象并不是真正的HTML或XML的tag,所以它没有name和attribute属性.但有时查看它的 .name 属性是很方便的,所以 BeautifulSoup 对象包含了一个值为 “[document]” 的特殊属性 .name,请参考如下代码:
soup.name
# u'[document]'
3.1.4 Comment
请参考如下代码
markup = "<b><!--Hey, buddy. Want to buy a used parser?--></b>"
soup = BeautifulSoup(markup)
comment = soup.b.string
type(comment)
# <class 'bs4.element.Comment'>
输出结果如下图所示: