Python入门:Python3爬虫BeautifulSoup全面学习教程
Python入门:Python3爬虫BeautifulSoup全面学习教程
Python入门:Python3爬虫BeautifulSoup全面学习教程,该教程围绕 Python 爬虫核心工具 BeautifulSoup4(BS4)展开,先介绍爬虫 “发送 HTTP 请求、解析内容、提取数据、存储数据” 的核心流程,点明 BS4 在解析 HTML/XML 中的优势 ——API 简单、支持多解析器、功能全面。接着讲解环境搭建,需通过 pip 安装 beautifulsoup4 与 lxml 解析器,再以实例演示基础用法:用 requests 获取网页 HTML,创建 BS 对象,提取网页标题;深入介绍标签查找(find ()/find_all ())、属性筛选(class_/id)、文本与属性提取方法,还涵盖 CSS 选择器、标签父子 / 兄弟关系等进阶技巧。最后通过抓取百度导航链接并保存到 CSV 的实战案例巩固知识,同时提醒中文乱码、反爬机制等注意事项,助力新手快速掌握 BS4 网页数据抓取技能。
前言
Python作为一门简洁、易读、功能强大的编程语言,其基础语法是入门学习的核心。掌握好基础语法,能为后续的编程实践打下坚实的基础。本文将全面讲解Python3的基础语法知识,适合编程初学者系统学习。Python以其简洁优雅的语法和强大的通用性,成为当今最受欢迎的编程语言。本专栏旨在系统性地带你从零基础入门到精通Python核心。无论你是零基础小白还是希望进阶的专业开发者,都将通过清晰的讲解、丰富的实例和实战项目,逐步掌握语法基础、核心数据结构、函数与模块、面向对象编程、文件处理、主流库应用(如数据分析、Web开发、自动化)以及面向对象高级特性,最终具备独立开发能力和解决复杂问题的思维,高效应对数据分析、人工智能、Web应用、自动化脚本等广泛领域的实际需求。
🥇 点击进入Python入门专栏,Python凭借简洁易读的语法,是零基础学习编程的理想选择。本专栏专为初学者设计,系统讲解Python核心基础:变量、数据类型、流程控制、函数、文件操作及常用库入门。通过清晰示例与实用小项目,助你快速掌握编程思维,打下坚实根基,迈出自动化办公、数据分析或Web开发的第一步。
🥇 点击进入Python小游戏实战专栏, 寓教于乐,用Python亲手打造经典小游戏!本专栏通过开发贪吃蛇、飞机大战、猜数字、简易版俄罗斯方块等趣味项目,在实践中掌握Python核心语法、面向对象编程、事件处理、图形界面(如Pygame)等关键技能,将枯燥的代码学习转化为可见的成果,让学习编程充满乐趣与成就感,快速提升实战能力。
🥇 点击进入Python小工具实战专栏,告别重复劳动,用Python打造效率神器!本专栏教你开发文件批量处理、自动邮件通知、简易爬虫、桌面提醒、密码生成器、天气查询等实用小工具。聚焦os、shutil、requests、smtplib、schedule等核心库,通过真实场景案例,快速掌握自动化脚本编写技巧,解放双手,显著提升工作与生活效率,让代码真正服务于你的日常。
🥇 点击进入Python爬虫实战专栏,解锁网络数据宝库!本专栏手把手教你使用Python核心库(如requests、BeautifulSoup、Scrapy)构建高效爬虫。从基础网页解析到动态页面抓取、数据存储(CSV/数据库)、反爬策略应对及IP代理使用,通过实战项目(如电商比价、新闻聚合、图片采集、舆情监控),掌握合法合规获取并利用网络数据的核心技能,让数据成为你的超能力。
🥇 点击进入Python项目实战专栏,告别碎片化学习,挑战真实项目!本专栏精选Web应用开发(Flask/Django)、数据分析可视化、自动化办公系统、简易爬虫框架、API接口开发等综合项目。通过需求分析、架构设计、编码实现、测试部署的全流程,深入掌握工程化开发、代码复用、调试排错与团队协作核心能力,积累高质量作品集,真正具备解决复杂问题的Python实战经验。
🌐 前篇文章咱们练习了 Python3 selenium库全面学习教程 ,如果忘记了,可以去重温一下,不停的重复敲击基础代码,有助于让你更加熟练掌握一门语言。今天咱们继续学习 ,Python3爬虫BeautifulSoup全面学习教程,下面开始吧!
在数据驱动的时代,网页数据提取是获取信息的重要手段。Python凭借丰富的库生态成为爬虫开发的首选语言,而BeautifulSoup4(简称BS4)则是解析HTML/XML、提取网页数据的核心工具之一。本文将从基础到进阶,带大家掌握BeautifulSoup4的完整使用流程,帮助新手快速上手网页数据抓取。
一、爬虫基础与BeautifulSoup4简介
在学习BeautifulSoup4之前,我们先明确Python爬虫的核心流程,以及BS4在其中的定位。
1.1 爬虫的核心流程
Python爬虫本质是“自动获取网页数据”的程序,其标准流程分为4步:
- 发送HTTP请求:通过库(如requests)向目标网站发送请求,获取网页的HTML源代码。
- 解析HTML内容:对获取的HTML代码进行结构化解析,提取有用信息(BS4的核心作用)。
- 提取目标数据:定位HTML中的标签、属性或文本,筛选出需要的数据(如标题、链接、价格)。
- 存储数据:将提取的数据保存到CSV、JSON文件或数据库中,便于后续分析。
1.2 为什么选择BeautifulSoup4?
解析HTML的库有很多(如lxml、Scrapy),但BS4的优势在于:
- API简单易懂:无需复杂语法,新手也能快速上手。
- 支持多解析器:可搭配lxml(速度快)或Python内置的html.parser(无需额外安装)。
- 功能全面:支持标签查找、文本提取、属性操作,甚至修改HTML结构。
二、BeautifulSoup4环境搭建
使用BS4前需安装相关依赖,主要包括beautifulsoup4库和解析器(推荐lxml)。
2.1 安装命令
打开终端,执行以下pip命令:
# 安装BeautifulSoup4核心库 pip install beautifulsoup4 # 安装lxml解析器(速度比内置解析器快,推荐) pip install lxml # (可选)若无法安装lxml,可使用Python内置的html.parser,无需额外安装安装效果:

2.2 验证安装
安装完成后,在Python终端中执行以下代码,无报错则说明安装成功:
from bs4 import BeautifulSoup import lxml # 验证lxml是否安装成功print("安装成功!")三、BeautifulSoup4基础用法
基础用法的核心是“加载HTML→创建BS对象→提取数据”,我们以抓取百度、必应网页为例演示。
3.1 第一步:获取网页HTML(用requests库)
BS4本身不具备发送HTTP请求的能力,需配合requests库获取网页内容。示例:
import requests from bs4 import BeautifulSoup # 目标网页URL(以必应为例) url ="https://cn.bing.com/"# 发送GET请求获取网页内容 response = requests.get(url)# 处理中文乱码(关键!避免中文显示为乱码)# 方法1:直接指定编码(已知网页编码为utf-8时) response.encoding ="utf-8"# 方法2:自动检测编码(未知编码时,需先安装chardet:pip install chardet)# import chardet# encoding = chardet.detect(response.content)["encoding"] # 自动检测编码# response.encoding = encoding# 验证请求是否成功(状态码200表示成功)if response.status_code ==200: html_content = response.text # 获取HTML源代码print("成功获取网页HTML!")else:print(f"请求失败,状态码:{response.status_code}")运行效果:
3.2 第二步:创建BeautifulSoup对象
将获取的HTML源代码传入BeautifulSoup类,创建解析对象,指定解析器(如lxml):
# 创建BS对象,参数1:HTML内容,参数2:解析器 soup = BeautifulSoup(html_content,"lxml")# 若未安装lxml,可替换为内置解析器:soup = BeautifulSoup(html_content, "html.parser")# (可选)格式化输出HTML(便于查看结构,调试用)print(soup.prettify())3.3 第三步:提取网页标题(入门案例)
网页标题通常在<title>标签中,我们用BS4提取它:
# 方法1:用find()查找第一个匹配的<title>标签 title_tag = soup.find("title")# 提取标签内的文本(用get_text()方法)if title_tag:print("网页标题:", title_tag.get_text())# 输出:搜索 - Microsoft 必应else:print("未找到<title>标签")# 方法2:直接访问soup.title(简化写法,等价于find("title"))print("网页标题(简化写法):", soup.title.get_text())四、核心功能:标签查找与数据提取
BS4最常用的功能是“定位标签”,核心方法是find()和find_all(),配合属性筛选可精准提取数据。
4.1 按标签名查找
(如<a>、<p>、<div>)
find("标签名"):返回第一个匹配的标签。find_all("标签名"):返回所有匹配的标签(列表形式)。
示例:提取百度首页的所有链接(<a>标签):
import requests from bs4 import BeautifulSoup url ="https://www.baidu.com/" response = requests.get(url) response.encoding ="utf-8" soup = BeautifulSoup(response.text,"lxml")# 1. 查找第一个<a>标签 first_a = soup.find("a")print("第一个<a>标签:", first_a)# 输出完整标签(含属性和文本)print("第一个<a>标签的链接:", first_a.get("href"))# 获取href属性值print("第一个<a>标签的文本:", first_a.get_text())# 获取标签内文本# 2. 查找所有<a>标签(返回列表) all_a = soup.find_all("a")print(f"\n百度首页共有 {len(all_a)} 个<a>标签")# 遍历所有<a>标签,打印链接和文本for idx, a_tag inenumerate(all_a[:5]):# 只打印前5个,避免输出过长print(f"{idx+1}. 链接:{a_tag.get('href')}, 文本:{a_tag.get_text()}")运行效果:
4.2 按属性筛选标签(如class、id)
实际场景中,常需根据标签的class、id等属性筛选(如“查找id为su的按钮”)。
关键语法:
find("标签名", class_="类名"):注意class_带下划线(避免与Python关键字class冲突)。find("标签名",):直接用id参数筛选。find("标签名", attrs={"属性名": "属性值"}):通用写法,支持任意属性。
示例:提取百度首页的“百度一下”按钮(id为su的标签):
# 查找id为"su"的<input>标签 search_btn = soup.find("input",id="su")# 获取按钮的value属性(即按钮上的文本) btn_text = search_btn.get("value")# 或 search_btn["value"]print("百度搜索按钮文本:", btn_text)# 输出:百度一下# 示例2:查找class为"mnav"的所有<a>标签(百度首页的导航链接) nav_links = soup.find_all("a", class_="mnav")print("\n百度导航链接:")for link in nav_links:print(f"文本:{link.get_text()}, 链接:{link.get('href')}")4.3 提取标签的文本与属性
- 提取文本:
tag.get_text()(推荐,会自动忽略HTML标签,只保留纯文本)。 - 提取属性:
tag.get("属性名")(推荐,属性不存在时返回None,避免报错)或tag["属性名"](属性不存在时报错)。
示例:
# 假设我们有一个<a>标签:<a href="https://www.baidu.com">百度</a> a_tag = soup.find("a", class_="link")# 提取文本 text = a_tag.get_text()# 输出:百度# 提取属性 href = a_tag.get("href")# 输出:https://www.baidu.com class_name = a_tag.get("class")# 输出:["link"](class属性可能有多个值,返回列表)五、进阶用法:CSS选择器与标签关系
当HTML结构复杂时,基础的find()可能不够用,此时可使用CSS选择器或利用标签的父子/兄弟关系定位。
5.1 CSS选择器(select()方法)
BS4的select()方法支持CSS选择器语法(与jQuery类似),灵活度更高。常见语法如下:
| CSS选择器语法 | 作用 | 示例代码 |
|---|---|---|
tag | 选择指定标签 | soup.select("a")(所有标签) |
.class | 选择指定类名的标签 | soup.select(".mnav")(类为mnav) |
#id | 选择指定id的标签 | soup.select("#su")(id为su) |
tag1 tag2 | 选择tag1下的所有tag2(后代) | soup.select("div a")(div内的a) |
tag[attr=value] | 选择属性等于指定值的标签 | soup.select("a[href='https://www.baidu.com']") |
示例:用CSS选择器提取百度导航链接:
# 1. 选择class为"mnav"的所有<a>标签(等价于find_all("a", class_="mnav")) nav_links = soup.select("a.mnav")# 2. 选择id为"su"的<input>标签(等价于find("input",)) search_btn = soup.select("#su")[0]# select()返回列表,取第一个元素# 3. 选择div标签下的所有<a>标签(后代选择器) div_a_links = soup.select("div a")print("CSS选择器提取的导航链接:")for link in nav_links:print(f"文本:{link.get_text()}, 链接:{link.get('href')}")5.2 标签的父子与兄弟关系
HTML标签存在层级关系(如父标签、子标签、兄弟标签),BS4提供属性直接访问这些关系:
| 属性/方法 | 作用 | 示例代码 |
|---|---|---|
tag.parent | 获取当前标签的父标签 | a_tag.parent |
tag.children | 获取当前标签的所有子标签(迭代器) | list(a_tag.children) |
tag.next_sibling | 获取当前标签的下一个兄弟标签 | a_tag.next_sibling |
tag.previous_sibling | 获取当前标签的上一个兄弟标签 | a_tag.previous_sibling |
示例:获取百度首页第一个标签的父标签和子标签:
# 查找第一个<a>标签 first_a = soup.find("a")# 1. 获取父标签 parent_tag = first_a.parent print("第一个<a>标签的父标签文本:", parent_tag.get_text().strip())# 2. 获取所有子标签(若有) children_tags =list(first_a.children)print("第一个<a>标签的子标签数量:",len(children_tags))if children_tags:print("第一个子标签:", children_tags[0])六、实战案例:抓取网页数据并保存到CSV
学完基础后,我们做一个完整实战:抓取某网页的标题和链接,保存到CSV文件中(以百度首页为例)。
6.1 完整代码
import requests from bs4 import BeautifulSoup import csv # 用于操作CSV文件defcrawl_baidu_links():# 1. 获取网页内容 url ="https://www.baidu.com/" response = requests.get(url) response.encoding ="utf-8"if response.status_code !=200:print("请求失败!")return# 2. 解析HTML并提取数据 soup = BeautifulSoup(response.text,"lxml")# 提取所有class为"mnav"的<a>标签(导航链接) nav_links = soup.find_all("a", class_="mnav")# 存储数据的列表 data =[]for link in nav_links: title = link.get_text().strip()# 链接文本(标题) href = link.get("href").strip()# 链接地址if title and href:# 过滤空数据 data.append({"标题": title,"链接": href})# 3. 保存数据到CSV文件withopen("baidu_nav_links.csv","w", encoding="utf-8", newline="")as f:# 定义CSV表头 fieldnames =["标题","链接"] writer = csv.DictWriter(f, fieldnames=fieldnames) writer.writeheader()# 写入表头 writer.writerows(data)# 写入所有数据print("数据抓取完成!已保存到 baidu_nav_links.csv")# 执行爬虫 crawl_baidu_links()6.2 运行结果
执行代码后,会在当前目录生成baidu_nav_links.csv文件,打开后内容如下:
| 标题 | 链接 |
|---|---|
| 新闻 | http://news.baidu.com |
| hao123 | https://www.hao123.com |
| 地图 | http://map.baidu.com |
| 视频 | http://v.baidu.com |
七、常见问题与注意事项
- 中文乱码问题:
必须设置response.encoding,优先用chardet自动检测编码(需安装chardet库),或直接指定utf-8/gbk(根据网页实际编码)。 - 解析器选择:
- 推荐
lxml:速度快,支持容错(HTML不完整时也能解析)。 - 备用
html.parser:Python内置,无需安装,但速度较慢。
- 推荐
- 反爬机制:
频繁爬取同一网站可能被封IP,建议:- 控制爬取频率(用
time.sleep(1)添加延迟)。
- 控制爬取频率(用
- 标签不存在报错:
用tag.get("属性名")代替tag["属性名"],属性不存在时返回None,避免报错;判断标签是否存在后再提取文本(如if title_tag: print(title_tag.get_text()))。
添加User-Agent请求头(伪装浏览器):
headers ={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120.0.0.0 Safari/537.36"} response = requests.get(url, headers=headers)八、总结
本文从环境搭建到实战案例,覆盖了BeautifulSoup4的核心用法:
- 基础流程:获取HTML→创建BS对象→提取数据→保存数据。
- 核心方法:
find()/find_all()(按标签/属性查找)、get_text()(提取文本)、get()(提取属性)。 - 进阶技巧:CSS选择器(
select())、标签关系(父子/兄弟)。
BeautifulSoup4是Python爬虫的入门利器,掌握它后,可结合Scrapy等框架实现更复杂的爬虫项目。建议多找几个网页练习(如豆瓣、知乎),熟悉不同HTML结构的解析逻辑,逐步提升爬虫能力!
💡下一篇咱们学习 Python入门:Python3 Scrapy库全面学习教程!
附录:扩展学习资源
- 官方资源:
- Python官网:https://www.python.org
- PyPI:https://pypi.org(查找第三方库)
- 安装包等相关文件(另附带pycharm工具),网盘下载地址:https://pan.quark.cn/s/649af731037c
- 学习资料视频和文档资源,网盘下载地址: https://pan.quark.cn/s/ee16901a8954
- 本专栏特色资源:
- 代码资源仓库:ZEEKLOG专属资源在线获取
- 海量Python教程:关注公众号:xcLeigh,获取网盘地址
- 一对一答疑:添加微信与博主在线沟通(
备注“Python专栏”)
联系博主
xcLeigh 博主,全栈领域优质创作者,博客专家,目前,活跃在ZEEKLOG、微信公众号、小红书、知乎、掘金、快手、思否、微博、51CTO、B站、腾讯云开发者社区、阿里云开发者社区等平台,全网拥有几十万的粉丝,全网统一IP为 xcLeigh。希望通过我的分享,让大家能在喜悦的情况下收获到有用的知识。主要分享编程、开发工具、算法、技术学习心得等内容。很多读者评价他的文章简洁易懂,尤其对于一些复杂的技术话题,他能通过通俗的语言来解释,帮助初学者更好地理解。博客通常也会涉及一些实践经验,项目分享以及解决实际开发中遇到的问题。如果你是开发领域的初学者,或者在学习一些新的编程语言或框架,关注他的文章对你有很大帮助。
亲爱的朋友,无论前路如何漫长与崎岖,都请怀揣梦想的火种,因为在生活的广袤星空中,总有一颗属于你的璀璨星辰在熠熠生辉,静候你抵达。
愿你在这纷繁世间,能时常收获微小而确定的幸福,如春日微风轻拂面庞,所有的疲惫与烦恼都能被温柔以待,内心永远充盈着安宁与慰藉。
至此,文章已至尾声,而您的故事仍在续写,不知您对文中所叙有何独特见解?期待您在心中与我对话,开启思想的新交流。
💞 关注博主 🌀 带你实现畅游前后端!
🏰 大屏可视化 🌀 带你体验酷炫大屏!
💯 神秘个人简介 🌀 带你体验不一样得介绍!
🥇 从零到一学习Python 🌀 带你玩转Python技术流!
🏆 前沿应用深度测评 🌀 前沿AI产品热门应用在线等你来发掘!
💦 注:本文撰写于ZEEKLOG平台,作者:xcLeigh(所有权归作者所有) ,https://xcleigh.blog.ZEEKLOG.net/,如果相关下载没有跳转,请查看这个地址,相关链接没有跳转,皆是抄袭本文,转载请备注本文原地址。
📣 亲,码字不易,动动小手,欢迎 点赞 ➕ 收藏,如 🈶 问题请留言(或者关注下方公众号,看见后第一时间回复,还有海量编程资料等你来领!),博主看见后一定及时给您答复 💌💌💌