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

惊叹数据结构之美,品味排序算法之妙:对计排、桶排的详细介绍

惊叹数据结构之美,品味排序算法之妙:对计排、桶排的详细介绍

大家好,这里是小编的博客频道 小编的博客:就爱学编程 很高兴在ZEEKLOG这个大家庭与大家相识,希望能在这里与大家共同进步,共同收获更好的自己!!! 本文目录 * 引言 * 正文 * 一、计数排序(Counting Sort) * 二、基数排序(Radix Sort) * 三、总结 * 快乐的时光总是短暂,咱们下篇博文再见啦!!!不要忘了,给小编点点赞和收藏支持一下,在此非常感谢!!! 引言 排序算法中的基数排序和计数排序都是非基于传统比较的排序方法,它们各自有着独特的实现原理和应用场景。下面小编将从代码实现的角度对这两种排序算法进行详细介绍。 那接下来就让我们开始遨游在知识的海洋! 正文 一、计数排序(Counting Sort) 原理概述: 计数排序是一种适用于元素范围较小的排序算法。它利用一个额外的计数数组来记录待排序数组中每个元素出现的次数,然后根据这些次数来确定每个元素在最终排序数组中的位置。 代码实现步骤: 1. 确定元素范围:找出待排序数组中的最小值和最大值,记为min和max。2. 创建计数数组:创建

By Ne0inhk
每日精讲:环形链表、两个数组中的交集、随机链表的复制

每日精讲:环形链表、两个数组中的交集、随机链表的复制

Hello大家好! 很高兴与大家见面! 给生活添点快乐,开始今天的编程之路。 我的博客:<但愿. 我的专栏:C语言、题目精讲、算法与数据结构、C++ 欢迎点赞,关注 一 环形链表 1.1题目链接:环形链表II 1.2题目描述: 给定一个链表的头节点  head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。注意不允许修改 链表。

By Ne0inhk
《算法题讲解指南:优选算法-位运算》--33.判断字符是否唯一,34.丢失的数字

《算法题讲解指南:优选算法-位运算》--33.判断字符是否唯一,34.丢失的数字

🔥小叶-duck:个人主页 ❄️个人专栏:《Data-Structure-Learning》 《C++入门到进阶&自我学习过程记录》《算法题讲解指南》--从优选到贪心 ✨未择之路,不须回头 已择之路,纵是荆棘遍野,亦作花海遨游 目录 位运算基础前置知识: 位1的个数 比特位计数 汉明距离 只出现一次的数字 只出现一次的数字||| 34. 判断字符是否唯一 题目链接: 题目描述: 题目示例: 解法(位图的思想): 算法思路: C++算法代码: 算法总结及流程解析: 35. 丢失的数字 题目链接: 题目描述: 题目示例: 解法(位运算): 算法思路: C++算法代码: 算法总结及流程解析: 结束语 位运算基础前置知识:       回顾了上面位运算基础前置的知识这里有五道非常简单的题可以试试手,都是考察位运算的题目: 位1的个数 191.

By Ne0inhk
【数据结构】宜宾大学-计院-实验五

【数据结构】宜宾大学-计院-实验五

实验五 栈和队列(队列的基本操作) * 实验目的: * 链表结点结构: * 实验结果: * 运行截图: * 代码实现: 实验目的: 1.掌握队列的顺序存储结构和链式存储结构 2.实现队列的基本操作,包括队列的建立、入队列、出队列、判断队列是否空等 实验内容: 1.完成链队列的建立 2.实现链队列的入队操作 3.实现链队列的出队列操作 4.实现判断链队列是否为空 5.实现销毁链队列 6.自己设计一组数据,模拟入队列,出队列 链表结点结构: typedef struct QNode { int data; struct QNode *Next; }QNode,*QueuePtr; 队列结构: struct { QueuePtr front; QueuePtr rear; }Ptr;

By Ne0inhk