网络爬虫之BeautifulSoup详解(含多个案例)
优采云 发布时间: 2022-04-29 05:14网络爬虫之BeautifulSoup详解(含多个案例)
在文章中,我们可以很方便的获取网页内容即网页源代码,但通常我们所需要的只是里面的部分数据,这时就需要对网页内容进行解析,从而提取出有意义的数据。比较常见的方法有正则表达式、HTML或XML解析库等。本文我们就给大家介绍一个非常流行、实用、高效的网页解析第三方库-BeautifulSoup。
BeautifulSoup是Python的一个HTML或XML的第三方解析库,可以用它方便地从网页中提取数据。它提供一些简单的、Python式的函数来处理导航、搜索、修改分析树等功能。它是一个工具箱,利用它可以省去很多烦琐的提取工作,提高了解析效率。
(1)安装BeautifulSoup库和lxml库:pip install BeautifulSoup4 和pip install lxml
(2)导入BeautifulSoup类:from bs4 import BeautifulSoup
(3)创建BeautifulSoup对象,传递网页内容以及解析的方法,例如:
soup = BeautifulSoup(text, "html.parser")
(4)通过soup.prettify()方法对网页内容进行格式化输出。
(5)获取网页中的标签及其内容,例如:soup.标签名、soup.标签名.string等。
BeautifulSoup类的基本元素
简单程序演示基本元素用法
m_page.html文件内容如下:
*敏*感*词*教你学编程 *敏*感*词*教你学编程系列资源 *敏*感*词*教你学Python系列 (1)*敏*感*词*教你学Python(基础篇): 腾讯课堂 CSDN学院 (2)*敏*感*词*教你学Python(进阶篇): 腾讯课堂 CSDN学院 *敏*感*词*教你学Android系列 (1)*敏*感*词*教你学Android(基础篇):腾讯课堂 (2)*敏*感*词*教你学Android(案例篇):腾讯课堂 *敏*感*词*:1281147324(QQ)
页面效果如下:
网页标签遍历的主要属性
标签树遍历*敏*感*词*(m_page.html文件)
标签树遍历示例
m_test.html文件内容如下:
*敏*感*词*教你学编程 .python{ background-color:#9DF; padding:10; } .android{ background-color:#9CF; padding:10; } body{ background-color:#000; width:1000px; margin:auto; } #content{ background-color:#dFF; height:800px; } .title{ font-size:20px; font-weight:bold; color:#00F; } .stress{ font-weight:bold; font-style:italic; text-decoration:underline; padding-left:2px; padding-right:6px; color:#F00; } a{ color:#909; text-decoration:underline; } a:hover{ color:#00F; font-size:large; } *敏*感*词*教你学编程系列资源 *敏*感*词*教你学Python系列 (1)*敏*感*词*教你学Python(基础篇): 腾讯课堂 CSDN学院 (2)*敏*感*词*教你学Python(进阶篇): 腾讯课堂 CSDN学院 *敏*感*词*教你学Android系列 (1)*敏*感*词*教你学Android(基础篇):腾讯课堂 (2)*敏*感*词*教你学Android(案例篇):腾讯课堂 *敏*感*词*:1281147324(QQ)
页面效果如下:
想一想,尝试实现下述要求。(提示:class属性值是一个列表。)
通过标签遍历虽然可以查找到每一个标签,但过程比较繁琐,效率不高。在BeautifulSoup中为我们提供了一些高效的方法可以根据条件快速查找到符合条件的标签。
标准选择器
标 准 选 择 器 示 例
CSS 选 择 器 示 例
实战案例-获取各省份的大学信息
代码参考
import requestsfrom bs4 import BeautifulSoup<br /><br />def get_text(url): try: headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) '} # 构建请求头 res = requests.get(url, headers=headers) # 发送请求 res.encoding = res.apparent_encoding # 设置编码格式 res.raise_for_status() # 是否成功访问 return res.text # 返回网页源代码 except Exception as e: print(e) # 抛出异常, 打印异常信息<br /><br />def parse_province(text): # 解析网页获取省份及其链接 b_soup = BeautifulSoup(text, "html.parser") # 构建BeautifulSoup对象 ul_tag = b_soup.find(class_="txt3 center") # 找到ul标签 a_tags = ul_tag.select("li a") # 找到所有a标签 province_dict = {} # 定义字典 for item in a_tags: # 循环遍历每一个超链接 province_dict[item.string] = item["href"][2:] # 以省份为键,链接为值构建字典 province_dict.pop("海外") # 删除不需要的记录 return province_dict # 返回结果<br /><br />def get_schools_by_province(url): # 获取某个省份的所有学校信息 temp_content = get_text(url) # 请求网页,得到网页源代码 b_soup = BeautifulSoup(temp_content, "html.parser") # 构建BeautifulSoup对象 a_tags = b_soup.select("ul.l4 li a") # 获取所有的学校超链接 schools = [] # 定义列表,保存该省份所有的学校 for item in a_tags: # 循环遍历每一个标签 schools.append(item.string) # 获取标签内容即学校信息 return schools # 返回学校信息<br /><br />if __name__ == '__main__': index_url = "https://daxue.911cha.com/" # 起始页网址 content = get_text(index_url) # 请求网页获取源代码 provinces = parse_province(content) # 获取省份及其链接 with open("schools.txt", mode="w", encoding="utf-8") as fp: # 保存到文件 for key, value in provinces.items(): print("当前解析的省份为:", key, index_url + value) school_list = get_schools_by_province(index_url + value) # 获取某个省份的院校列表 for school in school_list: fp.write(",".join([school, key]) + "\n") # 保存学校、省份信息,单独占一行<br />
相关代码资源,可关注Python资源分享微信公众号,回复 bs即可获取。