![大数据采集与爬虫](https://wfqqreader-1252317822.image.myqcloud.com/cover/726/33643726/b_33643726.jpg)
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所示。
![](https://epubservercos.yuewen.com/F5B70F/17977546101607006/epubprivate/OEBPS/Images/52_01.jpg?sign=1739252581-eexuIYFkyEPFkb9R51wnfPXIsQlOGc4I-0-55c6572367e985d12bbff5c840bcdb28)
图2-13 lxml库的安装
2.BeautifulSoup库的安装
在安装BeautifulSoup库之前,请确保已经成功安装了lxml库。可参照第2.4.2节requests库的安装步骤安装BeautifulSoup库,关键步骤如图2-14所示。
![](https://epubservercos.yuewen.com/F5B70F/17977546101607006/epubprivate/OEBPS/Images/53_01.jpg?sign=1739252581-6fQAyqHj9xW4g54SDWU1d4eEmw3ek7bV-0-89219637c6a619cd216649a1b34212b2)
图2-14 BeautifulSoup库的安装
2.5.4 lxml库和BeautifulSoup库的基本用法
1.使用BeautifulSoup读取指定HTML文件或文档对象模型
在导入了BeautifulSoup库之后,就可以使用其open()方法,通过传入指定的HTML文件获得文档对象。同时,这里也可以直接使用BeautifulSoup类通过传入文档对象标签直接初始化。如果没有指定解析库的话,系统会默认使用lxml库。
![](https://epubservercos.yuewen.com/F5B70F/17977546101607006/epubprivate/OEBPS/Images/53_02.jpg?sign=1739252581-149xYBIXbYVfJDfTVIMdMRB6vDw4Qh6W-0-cc7dde276c73d0d324db954b2339a40a)
2.BeautifulSoup的tag对象是与其一一对应的
![](https://epubservercos.yuewen.com/F5B70F/17977546101607006/epubprivate/OEBPS/Images/53_03.jpg?sign=1739252581-T72yXty7UkS7mK9xXW5WbZhHxxt4DKeY-0-c7f3c0d89f14d8bcd2e32780a6460181)
tag对象有很多方法和属性,其中最重要的属性有name、attributes和string。
1)name属性表示该标签指向的标签类型。
![](https://epubservercos.yuewen.com/F5B70F/17977546101607006/epubprivate/OEBPS/Images/54_01.jpg?sign=1739252581-Zn3YbOmtKS0xmQPEHHpe0OJmYOWLeJcj-0-ab5a0e91c994da8d8acdfef8345b3552)
2)attributes属性表示该标签当中所指向的特定的属性值。
![](https://epubservercos.yuewen.com/F5B70F/17977546101607006/epubprivate/OEBPS/Images/54_02.jpg?sign=1739252581-cGv7pF39fs8C8uiFyF89q2yLK0MJ4oGc-0-df1175df789991334adc25202e0dc488)
3)string属性表示该标签中显示的文本内容。
![](https://epubservercos.yuewen.com/F5B70F/17977546101607006/epubprivate/OEBPS/Images/54_03.jpg?sign=1739252581-o84ITXodAJH60lpaEKdksuiZqeZfGQ0y-0-905c9bd835c10741de0465e93e9bf337)
3.使用文档节点树遍历和查询文档对象
操作文档树最简单的方法就是告诉它希望获取的tag的name,如果想获取<p>标签,只要用soup.p即可。
![](https://epubservercos.yuewen.com/F5B70F/17977546101607006/epubprivate/OEBPS/Images/54_04.jpg?sign=1739252581-gMmrW3FAnKqblRzPcn1piTIAhKK6CBaH-0-e3325df7945c9ba1d72b5677d0dc4cc7)
输出结果如下。
![](https://epubservercos.yuewen.com/F5B70F/17977546101607006/epubprivate/OEBPS/Images/54_05.jpg?sign=1739252581-7ilQDuPQDC98vBo41vjKHiRnWgzDWnn5-0-8bbb640b06c271c513749b5daf3044f7)
BeautifulSoup还可以实现更多复杂的针对文档节点的操作,包括contents、children、parents、next_sibling和previous_sibling等。
![](https://epubservercos.yuewen.com/F5B70F/17977546101607006/epubprivate/OEBPS/Images/54_06.jpg?sign=1739252581-jWBgXnHAjXVVCe3K4np4IurHFoT8TyyI-0-eda4a744b4c31378fc4075c2293c8e7e)
contents属性可以将tag的子节点以列表的形式输出。
![](https://epubservercos.yuewen.com/F5B70F/17977546101607006/epubprivate/OEBPS/Images/54_07.jpg?sign=1739252581-5oxYS13QS4UIsDtO0GeJqQjHDpzT6hyi-0-fada502261596d1b4e6e86ca939de95c)
输出结果如下。
![](https://epubservercos.yuewen.com/F5B70F/17977546101607006/epubprivate/OEBPS/Images/54_08.jpg?sign=1739252581-ggL1b8qrAQvUCCdcRQ8k5sl58w7O0Hq8-0-d36cc05bba25d47eaafae441a5a44864)
children生成器可以对tag的子节点进行循环。
![](https://epubservercos.yuewen.com/F5B70F/17977546101607006/epubprivate/OEBPS/Images/55_01.jpg?sign=1739252581-ATbooQvPrfrLElMyediZQOW87fijqDfa-0-37f863c20ed0a14ebec3f86be9fa88dc)
输出结果如下。
![](https://epubservercos.yuewen.com/F5B70F/17977546101607006/epubprivate/OEBPS/Images/55_02.jpg?sign=1739252581-G1yk5bxM68fjaSazcCuMKzl2VLGbqTJx-0-30c3db94c9d05e7fd434d56e45b8859e)
parent属性可以获取某个元素的父节点。
![](https://epubservercos.yuewen.com/F5B70F/17977546101607006/epubprivate/OEBPS/Images/55_03.jpg?sign=1739252581-a81nlcPo3cFh7egQ96miZr4MrS9Otf13-0-0f2120ac1fdb737ff7425f820ea4e465)
输出结果如下。
![](https://epubservercos.yuewen.com/F5B70F/17977546101607006/epubprivate/OEBPS/Images/55_04.jpg?sign=1739252581-CfhByCvql9LUBsL2G1CCR3Zm2BSABrYr-0-62c6494fa7d8a7e8dc7cb4f1788323b4)
next_sibling和previous_sibling属性可以查询兄弟节点。
![](https://epubservercos.yuewen.com/F5B70F/17977546101607006/epubprivate/OEBPS/Images/55_05.jpg?sign=1739252581-vxINpAfPu3MhkIBEhk1YiU8Z1nIhgIr3-0-99d3dfd5a3958fac1bda07e78e1e8a58)
输出结果如下。
![](https://epubservercos.yuewen.com/F5B70F/17977546101607006/epubprivate/OEBPS/Images/55_06.jpg?sign=1739252581-jLF8a3WnRdFEtuBsJO1vhe6NiB9UdEo8-0-a2594ccb172af5653665b8a2bbf369a1)