Python入门:Python3爬虫BeautifulSoup全面学习教程

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实战经验。


Python入门:Python3爬虫BeautifulSoup全面学习教程

🌐 前篇文章咱们练习了 Python3 selenium库全面学习教程 ,如果忘记了,可以去重温一下,不停的重复敲击基础代码,有助于让你更加熟练掌握一门语言。今天咱们继续学习 ,Python3爬虫BeautifulSoup全面学习教程,下面开始吧!

在数据驱动的时代,网页数据提取是获取信息的重要手段。Python凭借丰富的库生态成为爬虫开发的首选语言,而BeautifulSoup4(简称BS4)则是解析HTML/XML、提取网页数据的核心工具之一。本文将从基础到进阶,带大家掌握BeautifulSoup4的完整使用流程,帮助新手快速上手网页数据抓取。

一、爬虫基础与BeautifulSoup4简介

在学习BeautifulSoup4之前,我们先明确Python爬虫的核心流程,以及BS4在其中的定位。

1.1 爬虫的核心流程

Python爬虫本质是“自动获取网页数据”的程序,其标准流程分为4步:

  1. 发送HTTP请求:通过库(如requests)向目标网站发送请求,获取网页的HTML源代码。
  2. 解析HTML内容:对获取的HTML代码进行结构化解析,提取有用信息(BS4的核心作用)。
  3. 提取目标数据:定位HTML中的标签、属性或文本,筛选出需要的数据(如标题、链接、价格)。
  4. 存储数据:将提取的数据保存到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)

实际场景中,常需根据标签的classid等属性筛选(如“查找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
hao123https://www.hao123.com
地图http://map.baidu.com
视频http://v.baidu.com

七、常见问题与注意事项

  1. 中文乱码问题
    必须设置response.encoding,优先用chardet自动检测编码(需安装chardet库),或直接指定utf-8/gbk(根据网页实际编码)。
  2. 解析器选择
    • 推荐lxml:速度快,支持容错(HTML不完整时也能解析)。
    • 备用html.parser:Python内置,无需安装,但速度较慢。
  3. 反爬机制
    频繁爬取同一网站可能被封IP,建议:
    • 控制爬取频率(用time.sleep(1)添加延迟)。
  4. 标签不存在报错
    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的核心用法:

  1. 基础流程:获取HTML→创建BS对象→提取数据→保存数据。
  2. 核心方法find()/find_all()(按标签/属性查找)、get_text()(提取文本)、get()(提取属性)。
  3. 进阶技巧:CSS选择器(select())、标签关系(父子/兄弟)。

BeautifulSoup4是Python爬虫的入门利器,掌握它后,可结合Scrapy等框架实现更复杂的爬虫项目。建议多找几个网页练习(如豆瓣、知乎),熟悉不同HTML结构的解析逻辑,逐步提升爬虫能力!

💡下一篇咱们学习 Python入门:Python3 Scrapy库全面学习教程!

附录:扩展学习资源

  1. 官方资源
  2. 本专栏特色资源
    • 代码资源仓库:ZEEKLOG专属资源在线获取
    • 海量Python教程:关注公众号:xcLeigh,获取网盘地址
    • 一对一答疑:添加微信与博主在线沟通(备注“Python专栏”

联系博主

    xcLeigh 博主,全栈领域优质创作者,博客专家,目前,活跃在ZEEKLOG、微信公众号、小红书、知乎、掘金、快手、思否、微博、51CTO、B站、腾讯云开发者社区、阿里云开发者社区等平台,全网拥有几十万的粉丝,全网统一IP为 xcLeigh。希望通过我的分享,让大家能在喜悦的情况下收获到有用的知识。主要分享编程、开发工具、算法、技术学习心得等内容。很多读者评价他的文章简洁易懂,尤其对于一些复杂的技术话题,他能通过通俗的语言来解释,帮助初学者更好地理解。博客通常也会涉及一些实践经验,项目分享以及解决实际开发中遇到的问题。如果你是开发领域的初学者,或者在学习一些新的编程语言或框架,关注他的文章对你有很大帮助。

    亲爱的朋友,无论前路如何漫长与崎岖,都请怀揣梦想的火种,因为在生活的广袤星空中,总有一颗属于你的璀璨星辰在熠熠生辉,静候你抵达。

     愿你在这纷繁世间,能时常收获微小而确定的幸福,如春日微风轻拂面庞,所有的疲惫与烦恼都能被温柔以待,内心永远充盈着安宁与慰藉。

    至此,文章已至尾声,而您的故事仍在续写,不知您对文中所叙有何独特见解?期待您在心中与我对话,开启思想的新交流。


     💞 关注博主 🌀 带你实现畅游前后端!

     🏰 大屏可视化 🌀 带你体验酷炫大屏!

     💯 神秘个人简介 🌀 带你体验不一样得介绍!

     🥇 从零到一学习Python 🌀 带你玩转Python技术流!

     🏆 前沿应用深度测评 🌀 前沿AI产品热门应用在线等你来发掘!

     💦 :本文撰写于ZEEKLOG平台,作者:xcLeigh所有权归作者所有)https://xcleigh.blog.ZEEKLOG.net/,如果相关下载没有跳转,请查看这个地址,相关链接没有跳转,皆是抄袭本文,转载请备注本文原地址。


在这里插入图片描述

     📣 亲,码字不易,动动小手,欢迎 点赞 ➕ 收藏,如 🈶 问题请留言(或者关注下方公众号,看见后第一时间回复,还有海量编程资料等你来领!),博主看见后一定及时给您答复 💌💌💌

Read more

Spring 核心技术总结:IOC、AOP、事务管理与 MyBatis 整合实战

Spring 核心技术总结:IOC、AOP、事务管理与 MyBatis 整合实战

一、Spring 概述 1.1 Spring 介绍 Spring 是轻量级 Java EE 应用开源框架(全栈式开发框架,官网: http://spring.io ),由 Rod Johnson 创建,旨在解决企业级编程开发的复杂性。 1.2 Spring 的优点 1. IOC:解决传统 Web 开发中硬编码所造成的程序耦合(控制反转) 2. AOP:在运行期间不修改源代码对程序进行增强(切面编程) 3. 粘合剂:除自身功能外,还可以整合其他技术和框架 1.3 Spring 的体系结构 Spring 框架按功能分为五大模块: 模块分类核心功能Core Container(核心容器)提供

By Ne0inhk
Spring Boot 视图层与模板引擎

Spring Boot 视图层与模板引擎

Spring Boot 视图层与模板引擎 19.1 学习目标与重点提示 学习目标:掌握Spring Boot视图层与模板引擎的核心概念与使用方法,包括Spring Boot视图层的基本方法、Spring Boot与Thymeleaf的集成、Spring Boot与Freemarker的集成、Spring Boot与Velocity的集成、Spring Boot的静态资源管理、Spring Boot的实际应用场景,学会在实际开发中处理视图层问题。 重点:Spring Boot视图层的基本方法、Spring Boot与Thymeleaf的集成、Spring Boot与Freemarker的集成、Spring Boot与Velocity的集成、Spring Boot的静态资源管理、Spring Boot的实际应用场景。 19.2 Spring Boot视图层概述 Spring Boot视图层是指使用Spring Boot进行Web应用开发的方法。 19.2.1 视图层的定义 定义:视图层是指使用Spring Boot进行Web应用开发的方法。 作用:

By Ne0inhk
RUST异步并发安全与内存管理的最佳实践

RUST异步并发安全与内存管理的最佳实践

RUST异步并发安全与内存管理的最佳实践 一、引言 异步并发编程在提高系统性能和响应时间的同时,也带来了并发安全和内存管理的挑战。Rust语言以其独特的所有权、借用和生命周期系统,为解决这些问题提供了强大的工具。本章将深入探讨异步并发安全与内存管理的核心概念、常见问题及解决方案,并通过实战项目优化演示这些方法的应用。 二、异步并发安全的基础概念 2.1 所有权、借用与生命周期 Rust的所有权系统是其并发安全的基础。每个值都有唯一的所有者,当所有者离开作用域时,值会被自动释放。借用分为可变借用和不可变借用,同一时间只能有一个可变借用或多个不可变借用,从而避免数据竞争。生命周期则确保引用在所有者有效的时间内使用。 fnmain(){letmut s =String::from("hello");// s是所有者let r1 =&s;// 不可变借用let r2 =&s;// 不可变借用(允许)// let r3 = &mut s; // 可变借用(禁止,

By Ne0inhk
Spring Boot AOP(二) 代理机制解析

Spring Boot AOP(二) 代理机制解析

博主社群介绍: ① 群内初中生、高中生、本科生、研究生、博士生遍布,可互相学习,交流困惑。 ② 热榜top10的常客也在群里,也有数不清的万粉大佬,可以交流写作技巧,上榜经验,涨粉秘籍。 ③ 群内也有职场精英,大厂大佬,跨国企业主管,可交流技术、面试、找工作的经验。 进群免费赠送写作秘籍一份,助你由写作小白晋升为创作大佬,进群赠送ZEEKLOG评论防封脚本,送真活跃粉丝,助你提升文章热度。 群公告里还有全网大赛约稿汇总/博客提效工具集/ZEEKLOG自动化运营脚本 有兴趣的加文末联系方式,备注自己的ZEEKLOG昵称,拉你进群,互相学习共同进步。 文章目录 * Spring Boot AOP(二) 代理机制解析 * 1. 代理机制概述 * 2. JDK 动态代理源码解析 * 核心类和方法 * 流程示意 * 特点 * 3. CGLIB 代理源码解析 * 核心类 * 调用流程

By Ne0inhk