![Python 3爬虫、数据清洗与可视化实战](https://wfqqreader-1252317822.image.myqcloud.com/cover/550/23914550/b_23914550.jpg)
2.4 使用Beautiful Soup解析网页
通过requests库已经可以抓到网页源码,接下来要从源码中找到并提取数据。Beautiful Soup是python的一个库,其最主要的功能是从网页中抓取数据。Beautiful Soup目前已经被移植到bs4库中,也就是说在导入Beautiful Soup时需要先安装bs4库。安装bs4库的方式如图2-18所示。
![](https://epubservercos.yuewen.com/FEBC08/12741017203780806/epubprivate/OEBPS/Images/figure_0040_0001.jpg?sign=1738871828-cjJ0ks0yFBcQBuYj6jIyzWk8WOqA54Nc-0-6cb4e90a793d9cf6b87c01a49e6930ce)
图2-18
安装好bs4库以后,还需安装lxml库。如果我们不安装lxml库,就会使用Python默认的解析器。尽管Beautiful Soup既支持Python标准库中的HTML解析器又支持一些第三方解析器,但是lxml库具有功能更加强大、速度更快的特点,因此笔者推荐安装lxml库。安装Python第三方库后,输入下面的代码,即可开启Beautiful Soup之旅。
from bs4 import BeautifulSoup # 从bs4库中导入Beautiful Soup …… soup=BeautifulSoup(strhtml.text, 'lxml') # lxml解析网页文档 data= soup.select('#main > div > div.mtop.firstMod.clearfix > div.centerBox > ul.newsList > li > a') # 获取数据 print(data)
代码运行结果如图2-19所示。
![](https://epubservercos.yuewen.com/FEBC08/12741017203780806/epubprivate/OEBPS/Images/figure_0041_0001.jpg?sign=1738871828-GZIiYofJZb4hvaaECAc4bXwl4IsJY9gi-0-f666f9c7b8b9814995d21060afa958de)
图2-19
Beautiful Soup库能够轻松解析网页信息,它被集成在bs4库中,需要时可以从bs4库中调用。其表达语句如下。
from bs4 import BeautifulSoup
首先,HTML文档将被转换成Unicode编码格式,然后Beautiful Soup选择最合适的解析器来解析这段文档,此处指定lxml解析器进行解析。解析后便将复杂的HTML文档转换成树形结构,并且每个节点都是Python对象。这里将解析后的文档存储到新建的变量soup中,代码如下。
soup=BeautifulSoup(strhtml.text, 'lxml')
接下来用select(选择器)定位数据,定位数据时需要使用浏览器的开发者模式,将鼠标光标停留在对应的数据位置并右击,然后在快捷菜单中选择“检查”命令,如图2-20所示。
![](https://epubservercos.yuewen.com/FEBC08/12741017203780806/epubprivate/OEBPS/Images/figure_0041_0002.jpg?sign=1738871828-wr53C6YQKS3AKnvNnZR06oK3rWiOwCgr-0-85cc68b7cd6f140085cb08fa966000b1)
图2-20
随后在浏览器右侧会弹出开发者界面,右侧高亮的代码(参见图2-21(b))对应着左侧高亮的数据文本(参见图2-21(a))。右击右侧高亮数据,在弹出的快捷菜单中选择“Copy”→“Copy Selector”命令,便可以自动复制路径。
![](https://epubservercos.yuewen.com/FEBC08/12741017203780806/epubprivate/OEBPS/Images/figure_0042_0001.jpg?sign=1738871828-xIQI2rYXmlQPg9x9RdQ6ipXFli8DyZQu-0-788c713b63794bfb6d5fe20490581f60)
图2-21
将路径粘贴在文档中,代码如下。
#main > div > div.mtop.firstMod.clearfix > div.centerBox > ul.newsList > li:nth-child(1) > a
由于这条路径是选中的第一条的路径,而我们需要获取所有的头条新闻,因此将li:nth-child(1)中冒号(包含冒号)后面的部分删掉,代码如下。
#main > div > div.mtop.firstMod.clearfix > div.centerBox > ul.newsList > li > a
使用soup.select引用这个路径,代码如下。
data= soup.select('#main > div > div.mtop.firstMod.clearfix > div.centerBox > ul.newsList > li > a')