Python网络爬虫入门版笔记 五、BeautifulSoup库的介绍和基本使用
一、BeautifulSoup库简介
该库是一个非常优秀的python第三方库,能够对HTML、XML等格式进行解析,并且提取相关信息。
抽象的介绍它的作用就是,他能够把你给他的文档当做一锅汤,并熬制这锅汤。
安装方法:在cmd界面用pip进行安装,这里安装的是BeautifulSoup4也叫bs4。
二、BeautifulSoup的简单演示(practice_5)
这里首先给出一个用于演示的html页面:
http://python123.io/ws/demo.html
现在我们想要获取这个html页面的源代码,有两种方式:一是用浏览器在页面上右键查看源代码,二则是使用爬虫自动爬取。
我们使用如下代码:
- 这里的bs4是beautifulsoup4库的简写,第二行语句的意思是从BeautifulSoup4库中导
- BeautifulSoup这个类。
- 随后使用的BeautifulSoup()方法,是对返回的html内容进行解析,对html内容进行解析的语法是:
- BeautifulSoup(html页面内容,"html.parser")
- 一共有两个变量,一个是待解析的内容,一个是相应的解析器。
- 执行上述语句,如果可以打印出html标准格式的代码内容,则说明BeautifulSoup库安装成功。
- 最后一行代码调用的prettify()方法,是对代码进行美化,即在文本中添加换行符,此外也可对单个标签调用此方法,使其更易于阅读。
三、BeautifulSoup库的基本元素
1、理解BeautifulSoup类
首先我们要介绍对BeautifulSoup库的理解,这里以html文件为例,一个html文件由若干个标签组成,这些标签存在上下游关系,所以称之为一个标签树。而BeautifulSoup就是一个解析、维护、遍历“标签树”的功能库。只要提供的文件是标签类型,BeautifulSoup库就可以对其进行很好的解析。
而BeautifulSoup类可以这样理解:一个标签类型的文件对应了一个标签树,而一个标签树对应了一个BeautifulSoup类,甚至可以说上面提到的三者是的等价的,我们知道标签文件(或者说是标签树)中的一个标签对(Tag)可以有很多属性(attribute),而一个标签树就可以看做一个变量,一个BeautifulSoup类型的变量,对这个变量的操作即是对标签树的操作。
这个变量的创建通过如下方式:
这样两个参数也就较容易理解了,第一个参数指定标签树(标签文件),第二个参数指定对标签文件的解析器。解析器也有很多种,但使用的时候可能需要安装额外的库,如下:
但是无论哪种解析器,都是可以有效解析html和xml文档的,可以依据实际自行选择。
简单总结来说,BeautifulSoup类对应一个标签文档的全部内容。
2、BeautifulSoup类的基本元素
基本元素 |
说明 |
Tag |
标签,最基本的信息组织单元,分别用<>和<>标明开头和结尾 |
Name |
标签的名字,<p>..</p>的名字是'p',格式:<tag>.name |
Attributes |
标签的属性,字典形式组织,格式:<tag>.attrs |
NavigableString |
标签内非属性字符串,<>…</>中字符串,格式:<tag>.string |
Comment |
标签内字符串的注释部分,一种特殊的Comment类型 |
(1)由前面内容可知,BeautifulSoup类对应一个标签文档(由多个标签对组成)的全部内容,为了更好地理解,请看下面的代码:
运行上述代码,即可打印出:
<title>This is a python demo page</title>
即打印出html文档中一个名为“title”的标签的内容。
事实上,html文档中的所有标签都可以通过
tag = soup.标签名
这样的的方式获得。
当一个html文档中含有若干个标签名相同的标签时,用上述方法只能获得文档中的第一个标签名相同标签内容。
(2)下面介绍获取某个标签的标签名的方法,紧接着上面的代码,再添加如下语句:
就会打印出如下内容:
分别是,a标签的内容,和a标签的名字。
此外还可以这样使用获取标签的父母标签名字:
打印出的内容为:
(3)下面介绍获取标签属性的方式,标签属性以字典的形式(即键值对)组织。
在之前的基础上执行下面的代码:
即可返回a标签的属性字典:
也可以直接通过属性名,获取某个属性的值:
print(tag.attrs['href'])
则打印出:
http://www.icourse163.org/course/BIT-268001
即属性‘href’的值。
(4)查看类型
这里需要用到的函数为type(),比如执行下面的代码:
print(type(tag.attrs))
就可以打印出:
<class 'dict'>
可以知道这是个字典类型。
再比如,我们可以查看标签的类型:
print(type(tag))
就可以打印出:
<class 'bs4.element.Tag'>
可以发现该标签是bs4.element.Tag类型,即bs4库中定义的Tag类型。
(5)查看标签内非属性字符串
非属性字符串即在一个标签对中,两个首尾两个括号中间的内容:
<a>非属性字符串</a>
这里使用如下方法:
soup.a.string
即可将一个标签对中的非属性字符串打印出来。
我们可以检查一下它的类型:
type(soup.a.string)
可以知晓类型为:bs4.element.NavigableString,即bs4库中定义的NavigableString类型。
此外,当出现多个标签层次的时候,可以参考如下:
上面我们打印soup.p.string时,并不包含b标签,说明NavigableString是可以跨越多个层次的。
(6)注释类型
这里引入一个实例进行分析:
上面的标签文档中,b标签中间的是注释,注释在<-- -->中间并以‘!’开头,而p标签中间的是非属性字符串。
但是当我们打印他们的string时,都是返回一个字符串,但这两个字符串却是不同的类型,因此我们在分析文档时候需要对string进行类型判断。但这种情况并不常见。