2.5 lxml库和BeautifulSoup库的安装及使用
2.5.1 lxml库概述
lxml库的解析功能非常强大,效率非常高。lxml解析库的独特之处在于,它结合了很多其他类似库的运行速度、XML功能完整性与本机Python API的简单性,主要是兼容性优于著名的ElementTree API。因此,lxml解析库在Python中使用得非常广泛。
2.5.2 BeautifulSoup库概述
HTML网页数据包含各种标签、类和属性,并且还具有很好的层级关系。如何高效、准确地获取某个节点,是需要重点考虑的问题。BeautifulSoup是一个非常好的解析库。它可以从HTML或XML文件中提取数据的Python库。它能够非常容易地通过网页结构和属性提取特定的网页内容,并且提供基于Python的函数和自动转换编码方式,还能通过友好的转换器实现惯用的文档导航、查找、修改方式。它位于一个HTML或XML解析器之上,为迭代、搜索和修改解析树提供Python特有风格的操作。
2.5.3 lxml库和BeautifulSoup库的安装
前面使用requests库的方法抓取了百度的页面数据。现在需要使用lxml和BeautifulSoup解析库有针对性地提取需要的数据。
1.lxml库的安装
可参照第2.4.2节requests库的安装步骤安装lxml工具包,关键步骤如图2-13所示。

图2-13 lxml库的安装
2.BeautifulSoup库的安装
在安装BeautifulSoup库之前,请确保已经成功安装了lxml库。可参照第2.4.2节requests库的安装步骤安装BeautifulSoup库,关键步骤如图2-14所示。

图2-14 BeautifulSoup库的安装
2.5.4 lxml库和BeautifulSoup库的基本用法
1.使用BeautifulSoup读取指定HTML文件或文档对象模型
在导入了BeautifulSoup库之后,就可以使用其open()方法,通过传入指定的HTML文件获得文档对象。同时,这里也可以直接使用BeautifulSoup类通过传入文档对象标签直接初始化。如果没有指定解析库的话,系统会默认使用lxml库。

2.BeautifulSoup的tag对象是与其一一对应的

tag对象有很多方法和属性,其中最重要的属性有name、attributes和string。
1)name属性表示该标签指向的标签类型。

2)attributes属性表示该标签当中所指向的特定的属性值。

3)string属性表示该标签中显示的文本内容。

3.使用文档节点树遍历和查询文档对象
操作文档树最简单的方法就是告诉它希望获取的tag的name,如果想获取<p>标签,只要用soup.p即可。

输出结果如下。

BeautifulSoup还可以实现更多复杂的针对文档节点的操作,包括contents、children、parents、next_sibling和previous_sibling等。

contents属性可以将tag的子节点以列表的形式输出。

输出结果如下。

children生成器可以对tag的子节点进行循环。

输出结果如下。

parent属性可以获取某个元素的父节点。

输出结果如下。

next_sibling和previous_sibling属性可以查询兄弟节点。

输出结果如下。
