Python网络爬虫入门版笔记 五、BeautifulSoup库的介绍和基本使用

一、BeautifulSoup库简介

该库是一个非常优秀的python第三方库,能够对HTML、XML等格式进行解析,并且提取相关信息。

抽象的介绍它的作用就是,他能够把你给他的文档当做一锅汤,并熬制这锅汤。

 

安装方法:在cmd界面用pip进行安装,这里安装的是BeautifulSoup4也叫bs4。

 

二、BeautifulSoup的简单演示(practice_5)

这里首先给出一个用于演示的html页面:

http://python123.io/ws/demo.html

现在我们想要获取这个html页面的源代码,有两种方式:一是用浏览器在页面上右键查看源代码,二则是使用爬虫自动爬取。

我们使用如下代码:

Python网络爬虫入门版笔记 五、BeautifulSoup库的介绍和基本使用

  • 这里的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类型的变量,对这个变量的操作即是对标签树的操作。

这个变量的创建通过如下方式:

Python网络爬虫入门版笔记 五、BeautifulSoup库的介绍和基本使用

这样两个参数也就较容易理解了,第一个参数指定标签树(标签文件),第二个参数指定对标签文件的解析器。解析器也有很多种,但使用的时候可能需要安装额外的库,如下:

Python网络爬虫入门版笔记 五、BeautifulSoup库的介绍和基本使用

 

但是无论哪种解析器,都是可以有效解析html和xml文档的,可以依据实际自行选择。

简单总结来说,BeautifulSoup类对应一个标签文档的全部内容。

 

2、BeautifulSoup类的基本元素

基本元素

说明

Tag

标签,最基本的信息组织单元,分别用<>和<>标明开头和结尾

Name

标签的名字,<p>..</p>的名字是'p',格式:<tag>.name

Attributes

标签的属性,字典形式组织,格式:<tag>.attrs

NavigableString

标签内非属性字符串,<>…</>中字符串,格式:<tag>.string

Comment

标签内字符串的注释部分,一种特殊的Comment类型

(1)由前面内容可知,BeautifulSoup类对应一个标签文档(由多个标签对组成)的全部内容,为了更好地理解,请看下面的代码:

Python网络爬虫入门版笔记 五、BeautifulSoup库的介绍和基本使用

运行上述代码,即可打印出:

<title>This is a python demo page</title>

即打印出html文档中一个名为“title”的标签的内容。

事实上,html文档中的所有标签都可以通过

tag = soup.标签名

这样的的方式获得。

当一个html文档中含有若干个标签名相同的标签时,用上述方法只能获得文档中的第一个标签名相同标签内容。

(2)下面介绍获取某个标签的标签名的方法,紧接着上面的代码,再添加如下语句:

Python网络爬虫入门版笔记 五、BeautifulSoup库的介绍和基本使用

就会打印出如下内容:

Python网络爬虫入门版笔记 五、BeautifulSoup库的介绍和基本使用

分别是,a标签的内容,和a标签的名字。

此外还可以这样使用获取标签的父母标签名字:

Python网络爬虫入门版笔记 五、BeautifulSoup库的介绍和基本使用

打印出的内容为:

Python网络爬虫入门版笔记 五、BeautifulSoup库的介绍和基本使用

 

(3)下面介绍获取标签属性的方式,标签属性以字典的形式(即键值对)组织。

在之前的基础上执行下面的代码:

Python网络爬虫入门版笔记 五、BeautifulSoup库的介绍和基本使用

即可返回a标签的属性字典

Python网络爬虫入门版笔记 五、BeautifulSoup库的介绍和基本使用

也可以直接通过属性名,获取某个属性的值:

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类型。

此外,当出现多个标签层次的时候,可以参考如下:

Python网络爬虫入门版笔记 五、BeautifulSoup库的介绍和基本使用

上面我们打印soup.p.string时,并不包含b标签,说明NavigableString是可以跨越多个层次的。

 

(6)注释类型

这里引入一个实例进行分析:

Python网络爬虫入门版笔记 五、BeautifulSoup库的介绍和基本使用

上面的标签文档中,b标签中间的是注释,注释在<-- -->中间并以‘!’开头,而p标签中间的是非属性字符串。

但是当我们打印他们的string时,都是返回一个字符串,但这两个字符串却是不同的类型,因此我们在分析文档时候需要对string进行类型判断。但这种情况并不常见。