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=1739224149-xd1RzeOAhSb25zH6Pjhcjeh6NVcuYODe-0-9a0d7e525ad4a5fb869ee9f03ab9eadb)
图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=1739224149-6MAa7tttHPA10760VrBq4ukEe2lUHTRM-0-0a525501ece81a130b195b14f842a23f)
图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=1739224149-2b6figwqDngW3fg473k4RmZkILJB6GD9-0-4e0b3dd4c4fa17db0239e635d9aa95c0)
2.BeautifulSoup的tag对象是与其一一对应的
![](https://epubservercos.yuewen.com/F5B70F/17977546101607006/epubprivate/OEBPS/Images/53_03.jpg?sign=1739224149-qLYTH6pg09rlPb9PCfOuPEX2oghLDEmg-0-e8b3ee7fd0edad9384e2219ce066596c)
tag对象有很多方法和属性,其中最重要的属性有name、attributes和string。
1)name属性表示该标签指向的标签类型。
![](https://epubservercos.yuewen.com/F5B70F/17977546101607006/epubprivate/OEBPS/Images/54_01.jpg?sign=1739224149-mD5ZxWZtkZzs95G5WE86lOtAFsLufh6P-0-d01009303afb736b012b69741106e72c)
2)attributes属性表示该标签当中所指向的特定的属性值。
![](https://epubservercos.yuewen.com/F5B70F/17977546101607006/epubprivate/OEBPS/Images/54_02.jpg?sign=1739224149-1gNPIR8C8DFf8KxNMoKiOlrbsjvZGC8q-0-68c33eb9531a1e1ee9f9f9b894fb7404)
3)string属性表示该标签中显示的文本内容。
![](https://epubservercos.yuewen.com/F5B70F/17977546101607006/epubprivate/OEBPS/Images/54_03.jpg?sign=1739224149-wh06DX3vxO7DBCC6Anj3HWwpwThTUCjt-0-4d98143f82ceebcd305c3363accb48cc)
3.使用文档节点树遍历和查询文档对象
操作文档树最简单的方法就是告诉它希望获取的tag的name,如果想获取<p>标签,只要用soup.p即可。
![](https://epubservercos.yuewen.com/F5B70F/17977546101607006/epubprivate/OEBPS/Images/54_04.jpg?sign=1739224149-SyCuM9TsYmkhYBBEySHhkvCJe6P5fBCr-0-21749fca7d39c257192bce31affb9be9)
输出结果如下。
![](https://epubservercos.yuewen.com/F5B70F/17977546101607006/epubprivate/OEBPS/Images/54_05.jpg?sign=1739224149-XM378gjXeAmg0VrPU4PltGNe7zRGHR74-0-db3826d8f5a36bf2745232a010f5c6ff)
BeautifulSoup还可以实现更多复杂的针对文档节点的操作,包括contents、children、parents、next_sibling和previous_sibling等。
![](https://epubservercos.yuewen.com/F5B70F/17977546101607006/epubprivate/OEBPS/Images/54_06.jpg?sign=1739224149-gv9U6qJWwYoBQCqeauvxfvl6ApU4wBnO-0-abb234b68e49a1e749ebf92a4f6d6901)
contents属性可以将tag的子节点以列表的形式输出。
![](https://epubservercos.yuewen.com/F5B70F/17977546101607006/epubprivate/OEBPS/Images/54_07.jpg?sign=1739224149-eqDTZARiyvwdJz70BMjcXNYVBtnIHUAP-0-0524632b32ad78f4b222423bb559d48c)
输出结果如下。
![](https://epubservercos.yuewen.com/F5B70F/17977546101607006/epubprivate/OEBPS/Images/54_08.jpg?sign=1739224149-zpmUOzGfTuw5wshicqYqeWhuCJlc0un0-0-a28d90802e38a6c1acac6a4fd1cd6cfc)
children生成器可以对tag的子节点进行循环。
![](https://epubservercos.yuewen.com/F5B70F/17977546101607006/epubprivate/OEBPS/Images/55_01.jpg?sign=1739224149-HahWPXjnWefmM20Lkmjje34RobOdT7Oq-0-2a08b43163faf2b612d73508eacb8dae)
输出结果如下。
![](https://epubservercos.yuewen.com/F5B70F/17977546101607006/epubprivate/OEBPS/Images/55_02.jpg?sign=1739224149-583ikuVtHO9OeMlekaMM5rTJRoRxqqWV-0-ac36e6250e41f9bb715da8386306708a)
parent属性可以获取某个元素的父节点。
![](https://epubservercos.yuewen.com/F5B70F/17977546101607006/epubprivate/OEBPS/Images/55_03.jpg?sign=1739224149-syxZmjCJxOOc1OcuT3HgyMf78yDt0V2L-0-a421d59df227c5b1b59b99d68205233a)
输出结果如下。
![](https://epubservercos.yuewen.com/F5B70F/17977546101607006/epubprivate/OEBPS/Images/55_04.jpg?sign=1739224149-IUD1dMZ5Vwcf3QHPhOhrqxWqcFBJ23qB-0-7dc47a8d448fdf24556f9407e04e9702)
next_sibling和previous_sibling属性可以查询兄弟节点。
![](https://epubservercos.yuewen.com/F5B70F/17977546101607006/epubprivate/OEBPS/Images/55_05.jpg?sign=1739224149-YyFzsmK9SaoLAltSemiDKY5cw9LMIjYQ-0-54a051508c28ba4aa362f4303b493060)
输出结果如下。
![](https://epubservercos.yuewen.com/F5B70F/17977546101607006/epubprivate/OEBPS/Images/55_06.jpg?sign=1739224149-risRpDehSqqxrm4Uj8hVTw9bt3npJEGJ-0-258c50c6e20489a465b74527a2647c54)