BeautifulSoup 技术通常用于分析网页结构,爬取相应的 Web 文档,对于不规则的 HTML 文档提供一定的补全功能,从而节省开发者的时间和精力。
在 Python 3.x 中安装 BeautifulSoup 主要利用 pip 命令。
在命令行中输入以下命令即可下载安装:
pip install bs4
BeautifulSoup不仅支持 Python 标准库中的 HTML 解析器,还支持一些第三方的解析器,这里我们下载一个第三方的解析器——lxml:
pip install lxml
另外再下载一个可供选择的解析器是纯 Python 实现的 html5lib:
pip install html5lib
下面我们来简单对比一下各种解析器:
安装成功后,在程序中导入 BeautifulSoup 库方法如下:
from bs4 import BeautifulSoup
2、快速上手BeautifulSoup 解析
首先引入以下的一个简单 html 文件作为例子介绍 BeautifulSoup 的使用:
静夜思
床前明月光,
疑是地上霜。
举头望明月,
低头思故乡。
李白(701年-762年) ,字太白,号青莲居士,又号“谪仙人”,
唐代伟大的浪漫主义诗人,被后人誉为“诗仙”,与
并称为“李杜”,为了与另两位诗人
与杜牧
即“小李杜”区别,杜甫与李白又合称“大李杜”。
据《新唐书》记载,李白为兴圣皇帝(凉武昭王李暠)九世孙,与李唐诸王同宗。
其人爽朗大方,爱饮酒作诗,喜交友。
将其保存为html文件,通过浏览器打开网页,效果如下图所示:
(2.1) BeautifulSoup 解析 HTML
通过解析HTML代码,创建一个 BeautifulSoup 对象,然后调用 prettify() 函数格式化输出网页
from bs4 import BeautifulSoup
html = ‘’’
静夜思
床前明月光,
疑是地上霜。
举头望明月,
低头思故乡。
李白(701年-762年) ,字太白,号青莲居士,又号“谪仙人”,
唐代伟大的浪漫主义诗人,被后人誉为“诗仙”,与
并称为“李杜”,为了与另两位诗人
与杜牧
即“小李杜”区别,杜甫与李白又合称“大李杜”。
据《新唐书》记载,李白为兴圣皇帝(凉武昭王李暠)九世孙,与李唐诸王同宗。
其人爽朗大方,爱饮酒作诗,喜交友。
‘’’
按照标准的所进行时的结构输出
soup = BeautifulSoup(html)
print(soup.prettify())
值得指出的是,前面定义的 HTML 代码源码标签中是缺少结束标签的,具体而言,缺少 和 标签,但是使用 prettify() 函数输出的结果已经自动补齐了结束标签,这是 BeautifulSoup 的一个优点。
BeautifulSoup 即使得到了一个损坏的标签,也会产生一个 DOM 树,并尽可能与原文档内容的含义一致,这种措施通常能够帮助用户更正确地搜集数据。
另外,还可以用本地 HTML 文件来创建 BeautifulSoup 对象:
soup = BeautifulSoup(open(‘t.html’))
(2.2)简单获取网页标签信息
当使用 BeautifulSoup 解析网页时,有时会想获取某个标签之间的信息,具体代码如下:
from bs4 import BeautifulSoup
创建本地文件 soup 对象
soup = BeautifulSoup(open(‘t.html’, encoding=‘utf-8’), “html.parser”)
获取标题
title = soup.title
print(‘标题:’, title)
获取头部
head = soup.head
print(‘头部:’, head)
获取 a 标签
a = soup.a
print(‘超链接内容:’, a)
获取 p 标签
p = soup.p
print(‘超链接内容:’, p)
(2.3)定位标签并获取内容
下述代码将实现获取网页所有的超链接标签及对应的 URL 内容:
from bs4 import BeautifulSoup
创建本地文件 soup 对象
soup = BeautifulSoup(open(‘t.html’, encoding=‘utf-8’), “html.parser”)
从文档中找到 的所有标签链接
for a in soup.find_all(‘a’):
print(a)
获取 的超链接
for link in soup.find_all(‘a’):
print(link.get(‘href’))
获取文字内容
for poeter in soup.find_all(‘a’):
print(poeter.get_text())
3、深入了解 BeautifulSoup
(3.1)BeautifulSoup 对象
BeautifulSoup 将复杂的 HTML 文档个转换成一个树形结构,每个节点都是 Python 对象,BeautifulSoup 官方文档将所有对象总结为 4 种:
-
Tag;
-
NavigableString;
-
BeautifulSoup;
-
Comment。
(3.1.1)Tag
Tag 对象表示 XML 或 HTML 文档中的标签,通俗地将就是 HTML 中的一个标签,该对象与 HTML 或 XML 原生文档中的标签相同。 Tag 有很多方法和属性,BeautifulSoup 中定义为 Soup.Tag,其中 Tag 为 HTML 中的标签,比如 head、title 等,其返回结果完整的标签内容,包括标签的属性和内容等。
静夜思
例如上述代码中,title、p、a 等都是标签,起始标签(、
、)和结束标签(
、from bs4 import BeautifulSoup
创建本地文件 soup 对象
soup = BeautifulSoup(open(‘t.html’, encoding=‘utf-8’), “html.parser”)
print(soup.title)
print(soup.head)
print(soup.p)
print(soup.a)
值得注意一下的是,它返回的内容是多有标签中第一个符合要求的标签。
很显然,通过 BeautifulSoup 对象即可轻松获取标签和标签内容,这比第三讲中的正则表达式要方便得多。
该段代码输出的是该对象的类型,即Tag对象
from bs4 import BeautifulSoup
创建本地文件 soup 对象
soup = BeautifulSoup(open(‘t.html’, encoding=‘utf-8’), “html.parser”)
print(type(soup.html))
Tag 属性和方法众多,其中最重要的两个属性:name 和 attrs。
(1)name
name 属性用于获取文档树的标签名字。如果想获取 head 标签名字,则使用 soup.head.name 代码即可。对于内部标签,输出的值便为标签本身的名字。BeautifulSoup 对象本是比较特殊,它的 name 为 document。
print(soup.name)
print(soup.head.name)
print(soup.title.name)
(2)attrs
一个标签(Tag)可能有多个属性,例如:
它存在两个属性:一个是 class 属性,对应的值为“poet”;另一个是 id 属性,对应的值为“link1”。Tag 属性的操作方法与 Python 字典相同,获取 p 标签的所有属性代码如下,得到一个字典类型的值。它获取的是第一个段落 p 的属性及属性值。
print(soup.p.attrs)
如果要单独获取某个属性,则可以使用如下两种方法来获取超链接的 class 属性值。
print(soup.a[‘class’])
print(soup.a.get(‘class’))
BeautifulSoup 的每个标签 Tag 可能有多个属性,可以通过 “.attrs” 获取其属性。Tag 的属性可以被修改、删除、添加。
下面举个简单的例子进行介绍:
该段代码输出的是该对象的类型,即Tag对象
from bs4 import BeautifulSoup
创建本地文件 soup 对象
soup = BeautifulSoup(‘黄建雷’, “html.parser”)
tag = soup.b
print(tag)
print(type(tag))
NAME
print(tag.name)
print(tag.string)
Attributes
print(tag.attrs)
print(tag[‘class’])
print(tag.get(‘id’))
修改属性,增加属性name
tag[‘class’] = ‘abc’
tag[‘id’] = ‘1’
tag[‘name’] = ‘2’
print(tag)
删除属性
del tag[‘class’]
del tag[‘name’]
print(tag)
print(tag[‘class’]) # 此语句会报错
(3.1.2)NavigableString
前面介绍了如何获取标签的 name 和 attrs,如果想获取标签对应的内容,可以使用 string 属性获取。
from bs4 import BeautifulSoup
创建本地文件 soup 对象
soup = BeautifulSoup(open(‘t.html’, encoding=‘utf-8’), “html.parser”)
print(soup.a[‘class’])
print(soup.a.string)
由上述代码可以看出,利用 string 属性获取标签 <> 和 </> 之间的内容要比利用正则表达式方便得多。
BeautifulSoup 用 NavigableString 类来包装 Tag 中的字符串,其中,NavigableString 表示可遍历的字符串。一个 NavigableString 字符串与 Python 中的 Unicode 字符串相同,并且支持包含在遍历文档树和搜索文档树中的一些特性。
该段代码用来查看 NavigableString 的类型
from bs4 import BeautifulSoup
创建本地文件 soup 对象
soup = BeautifulSoup(open(‘t.html’, encoding=‘utf-8’), “html.parser”)
tag = soup.title
print(type(tag.string))
当然,通过 unicode() 方法可以直接将 NavigableString 对象转化成 Unicode 字符串。
from bs4 import BeautifulSoup
创建本地文件 soup 对象
soup = BeautifulSoup(open(‘t.html’, encoding=‘utf-8’), “html.parser”)
tag = soup.title
unicode_string = tag.string
print(unicode_string)
最后再说明一点,标签中包含的字符串不能编辑,但是可以被替换成其他的字符串,用 replace_with() 方法即可实现。
tag.string.replace(“替换前的内容”, " 替换后的内容 ")
from bs4 import BeautifulSoup
文末有福利领取哦~
👉一、Python所有方向的学习路线
Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
👉二、Python必备开发工具
👉三、Python视频合集
观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
👉 四、实战案例
光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。(文末领读者福利)
👉五、Python练习题
检查学习结果。
👉六、面试资料
我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
👉因篇幅有限,仅展示部分资料,这份完整版的Python全套学习资料已经上传
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!