9.3.1 beautifulsoup4库概述

9.3.1 beautifulsoup4库概述

使用requests库获取HTML页面并将其转换为字符串后,需要进一步解析HTML页面格式,提取有效信息,这就需要处理HTML和XML的函数库。

beautifulsoup4库也称为Beautiful Soup库或bs4库,用于解析和处理HTML和XML。需要注意的是,它不是Beautifulsoup库。它的最大优点是能根据HTML和XML语法建立解析树,进而高效地解析其中的内容。

beautifulsoup4库不是Python的标准库,需要安装,安装语句:

HTML建立的Web页面一般非常复杂,除了有用的内容信息之外,还包括大量用于页面格式的元素,直接解析一个Web网页需要深入了解HTML语法。beautifulsoup4库将专业的Web库页面格式解析部分封装成函数,提供了若干有用且便捷的处理函数。

beautifulsoup4库采用面向对象思想实现,简单地说,它把每个页面都当作一个对象,通过a.b()的方式调用对象的属性,或者通过a.b()的方式调用方法。

在使用beautifulsoup4库之前,需要进行引用,由于这个库名非常特殊且这个库采用面向对象方式组织,常用from…import模式从库中直接引用BeautifulSoup类。

beautifulsoup4库中最主要的是BeautifulSoup类,每个实例化的对象都相当于一个页面。

BeautifulSoup类的构造方法第一个参数是要解析的HTML文档,第二个参数是Beautiful Soup的解析器。BeautifulSoup支持Python标准库中的HTML解析器、lxml解析器,还支持一些第三方解析器,如果不安装这些第三方解析器,BeautifulSoup使用Python默认的解析器lxml。lxml解析器很强大,速度也很快。

例如,有一个HTML源码:

创建BeautifulSoup对象,使用lxml的语句如下:

创建的BeautifulSoup对象是一个树形结构,它包含HTML页面中的每个Tag(标签)元素,如<head>、<body>、<div>等。也就是说,HTML中的主要结构都变成了BeautifulSoup对象的一个属性,可以直接用a.b()形式获得,其中b的名字采用HTML中标签的名字。BeautifulSoup对象的常用属性如表9-4所示。

表9-4 BeautifulSoup对象的常用属性

例如,输出百度网页的头部标签,代码如下:

运行结果:

输出百度网页头部中的标题标签,代码如下:

运行结果:

输出百度网页头部中的段落标签,代码如下:

运行结果:

Beautiful Soup对象中属性名与HTML的标签名称相同,远不止表9-4中的这些。每一个Tag标签在beautifulsoup4库中都是一个对象,称为Tag对象。如上例代码中的title是一个标签对象。每个标签对象在HTML中都有类似的结构。例如HTML源码:

其中尖括号“<>”中标签的名字是name,尖括号中其他项是attrs,尖括号之间的内容是string。因此,可以通过Tag标签对象的name、attrs和string属性获得相应的内容,格式为a.b(),如:

由于HTML语法可以在标签中嵌套其他标签,所以string属性的返回值遵循如下原则。

①如果标签内部没有其他标签,string属性返回其中的内容。

②如果标签内部还有其他标签,但只有一个标签,string属性返回最里面标签的内容。

③如果标签内部有超过1层嵌套的标签,string属性返回None(空字符串)。

HTML语法中同一个标签会有很多内容,例如<a>标签,百度首页一共有13处,列表如下:

直接调用soup.a只能返回第一个:

HTML标签可以嵌套很多层,获取内容时也可以用嵌套的方式,例如:

还可以用“标签[属性]”这种形式来获取属性值,如:

也可以用get()方法获取属性,如:

用.contents形式还可以将所有的子标签存入一个列表中,如: