Python爬虫入门教程 使用BeautifulSoup抓取网页数据
还在为使用正则表达式手动解析HTML而烦恼吗?这种方法在处理复杂嵌套标签时往往捉襟见肘,调试过程更是耗时耗力。
是时候拥抱更高效的工具了。BeautifulSoup,作为Python中强大的HTML/XML解析库,能够将网页解析工作变得直观且优雅。本文将为你提供一份从入门到精通的完整指南,助你彻底掌握网页数据抓取技巧。

第一步:安装beautifulsoup4
安装过程极其简单。建议同时安装`lxml`解析器,它能显著提升解析速度和准确性。
pip install beautifulsoup4
pip install lxml # 推荐搭配这个解析器,快
基本用法:3 分钟上手
通过一个简单的Python爬虫示例,快速了解BeautifulSoup的工作流程:
from bs4 import BeautifulSoup
html = """
测试页面
Hello 仰望天空的蜗牛
个人 -逆旅行人
"""
soup = BeautifulSoup(html, 'lxml')
这里的`'lxml'`参数指定了所使用的解析器,是提升Python网页解析效率的关键。
find vs find_all
这是两个最核心的查找方法,它们的区别非常明确:
- `find()`:返回第一个匹配到的元素对象。
- `find_all()`:返回所有匹配元素的列表。
# 查找第一个p标签
first_p = soup.find('p')
print(first_p.text) # Hello 仰望天空的蜗牛
# 查找所有a标签
links = soup.find_all('a') # [个人 -逆旅行人]
for link in links:
print(link['href']) # https://no18.fun
熟练掌握这两个方法,足以应对绝大多数网页数据提取的需求。
按属性筛选:class、id、属性值
实际网页中的元素通常带有丰富的属性,BeautifulSoup提供了灵活的筛选方式。
按class查找: 注意,由于`class`是Python关键字,因此需要使用`class_`。
articles = soup.find_all('div', class_='content')
按id查找: 这是最直接的定位方式之一。
header = soup.find(id='main-header') # 查找id是main-header的元素
按任意属性查找: 支持字典形式或lambda函数,实现高度自定义的筛选逻辑。
# 查找所有href属性包含"no18"的链接
links = soup.find_all('a', href=lambda x: x and 'no18' in x)
# 使用字典传递属性条件
article = soup.find('div', {'class': 'content'})
CSS 选择器:前端那套直接套用
如果你熟悉CSS,那么`select`方法会让你得心应手。它完全支持CSS选择器语法,可以直接复制浏览器开发者工具中的选择器进行使用。
# 所有p标签
soup.select('p')
# class为title的元素
soup.select('.title')
# id为main的元素
soup.select('#main')
# div下的所有p
soup.select('div p')
# 更复杂的组合也支持
soup.select('div.content > p.title')
提取文本:text、get_text()、stripped_strings
定位到元素后,如何高效提取其中的文本内容?主要有三种方法:
element = soup.find('p')
# 方法1
print(element.text) # 'Hello 仰望天空的蜗牛'
# 方法2(推荐)
print(element.get_text()) # 'Hello 仰望天空的蜗牛'
# 方法3(去除多余空白)
print(' '.join(element.stripped_strings)) # 'Hello 仰望天空的蜗牛'
通常,`get_text()`方法兼容性最佳,是提取文本的首选。
实战:一键清理垃圾文本
html = """
标题
这是一段正文...
"""
soup = BeautifulSoup(html, 'lxml')
text = ' '.join(soup.body.stripped_strings)
print(text) # 标题 这是一段正文...
利用`stripped_strings`生成器可以自动过滤多余的空白字符,简化数据清洗过程。
导航节点:父子兄弟关系
BeautifulSoup的强大之处在于其完整的DOM树导航能力,允许你在HTML结构中自由移动。
soup = BeautifulSoup(html, 'lxml')
p = soup.find('p')
# 父节点
parent = p.parent
# 子节点列表
children = p.children
# 下一个兄弟节点
next_sibling = p.next_sibling
# 上一个兄弟节点
prev_sibling = p.previous_sibling
实战:抓取标题和内容对
articles = []
for header in soup.find_all('h2'):
title = header.get_text()
content = header.next_sibling.get_text() if header.next_sibling else ''
articles.append({'title': title, 'content': content})
修改HTML:还能改页面元素?
是的,BeautifulSoup不仅支持读取,还支持修改。你可以动态调整元素的属性、文本,甚至插入新的标签。
soup = BeautifulSoup('内容
', 'lxml')
p = soup.find('p')
# 改属性
p['class'] = ['new']
# 改文本
p.string = '新内容'
# 插入新标签
new_tag = soup.new_tag('span', id='extra')
new_tag.string = '额外信息'
p.append(new_tag)
print(soup)
# 新内容额外信息
这一功能在数据清洗和内容重构场景中非常实用。
实战:爬取豆瓣Top250
结合`requests`库,我们通过一个完整的Python爬虫案例来巩固所学。以下代码演示如何抓取豆瓣电影Top250第一页的数据:
import requests
from bs4 import BeautifulSoup
url = 'https://movie.douban.com/top250'
headers = {'User-Agent': 'Mozilla/5.0'}
response = requests.get(url, headers=headers)
soup = BeautifulSoup(response.text, 'lxml')
movies = []
for item in soup.find_all('div', class_='item'):
title = item.find('span', class_='title').get_text()
rating = item.find('span', class_='rating_num').get_text()
movies.append({'title': title, 'rating': rating})
for m in movies[:5]:
print(m)
运行代码后,你将获得类似如下的电影数据:
{'title': '肖申克的救赎', 'rating': '9.7'}
{'title': '霸王别姬', 'rating': '9.6'}
{'title': '泰坦尼克号', 'rating': '9.5'}
{'title': '阿甘正传', 'rating': '9.5'}
{'title': '千与千寻', 'rating': '9.4'}
一个经典的网络爬虫实例,仅用约二十行代码即可实现。
避坑指南
在Python爬虫开发过程中,请注意以下几个常见问题:
(1) NoneType has no attribute 'text'
这是最常见的错误,发生在对`None`对象调用方法时。
# ❌ 危险操作:如果找不到h1,soup.find('h1')返回None,再调用.text就会报错
title = soup.find('h1').text
# ✅ 安全做法:先检查元素是否存在
title_elem = soup.find('h1')
title = title_elem.text if title_elem else '默认标题'
务必养成防御性编程习惯,假设目标元素可能不存在。
(2) 编码问题导致乱码
# ✅ 明确指定编码,让BeautifulSoup正确解析
response.encoding = response.apparent_encoding
soup = BeautifulSoup(response.text, 'lxml')
(3) 被反爬封IP
# ✅ 适当加延时,做个有礼貌的爬虫
import time
time.sleep(1) # 放慢爬取速度
# ✅ 轮换User-Agent,模拟不同浏览器
headers = {
'User-Agent': random.choice([
'Mozilla/5.0 (Windows NT 10.0; Win64; x64)...',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)...'
])
}
遵守网络爬虫礼仪,控制请求频率,避免对目标网站造成过大负担。
高阶技巧:使用不同的解析器
BeautifulSoup支持多种解析器后端,可根据场景选择:
# 处理格式混乱的HTML,容错性最好,但速度较慢
soup = BeautifulSoup(html, 'html.parser')
# 专门解析XML,追求速度
soup = BeautifulSoup(html, 'lxml-xml')
# 最推荐:在速度和准确性上取得良好平衡
soup = BeautifulSoup(html, 'lxml')
对于大多数HTML解析任务,`lxml`是最佳选择。
学会beautifulsoup,爬虫就算是入门了
最后,我们来总结一下BeautifulSoup教程的核心知识点:
- find/find_all:定位元素的基本功。
- select:使用CSS选择器进行精准查找。
- text/get_text:提取元素内的文本内容。
- parent/next_sibling:在DOM树中灵活导航。
- 属性访问:读取或修改标签的属性。
掌握以上内容,你就能独立完成80%的静态网页数据抓取工作。
那么剩下的20%是什么情况呢?通常是页面内容由JavaScript动态加载,初始HTML中并不包含这些数据。这时就需要借助Selenium、Playwright等浏览器自动化工具来模拟用户操作。不过,这属于更进阶的爬虫技术,我们将在后续的文章中详细探讨。
游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。
同类文章
东软发布车载智能出行方案7.0与AI座舱平台
2026年北京国际车展于4月26日正式拉开帷幕。展会前夕,东软集团率先举办了智能汽车互联新品战略发布会,集中发布了其在智能汽车软件领域的一系列创新成果与战略布局。本次发布聚焦三大核心:全球车载智能出行解决方案OneCoreGo的重大版本迭代、全新AI座舱软件平台NAGIC AI的首次亮相,以及旗下子
比亚迪大唐预售首日订单破3万 D级旗舰SUV市场迎新标杆
24小时,3万台订单。比亚迪王朝网首款D级旗舰SUV“大唐”的预售成绩单,一公布就引发了市场热议。这个数字不仅刷新了品牌自身的预售纪录,更向整个高端新能源SUV市场投下了一枚重磅冲击波。 这款备受瞩目的新车,此前已披露了诸多硬核信息。作为王朝网的旗舰之作,大唐EV集成了比亚迪当前多项尖端技术,包括第
中国工业机器人出口激增 移动机器人海外市场加速拓展
近期,海关总署发布的一组数据在行业内引发热议。统计显示,今年我国工业机器人出口增长势头强劲,其中4月份单月出口量首次突破2 5万台,同比增长接近90%。在这轮出海热潮中,移动机器人(AGV AMR)的表现格外突出,已成为彰显“中国智造”实力的重要名片。 这一出口增长态势的背后,反映了全球市场需求的差
尚界Z7T顶棚问题引热议 博主现场拆解视频动机成焦点
2025年北京国际车展现场,一段关于尚界Z7内饰体验的短视频在各大社交平台引发热议。然而,这次传播的焦点并非产品亮点,而是一种极具争议的交互演示方式,迅速成为公众讨论与行业反思的焦点。 视频画面显示,某平台体验人员在拍摄过程中,用手部施加较大力量扒开了尚界Z7顶棚内饰的边缘接缝处。这一片段经网络快速
地平线推出全新智能驾驶底座方案车企会买单吗
地平线创始人余凯 在今年的北京车展上,地平线向业界传递了一个清晰的战略信号:它已不再满足于仅仅扮演产业链中的“部件供应商”角色。 这家以智能驾驶芯片著称的科技公司,集中发布了中国首款舱驾融合整车智能体芯片“星空”、整车智能体操作系统KaKaClaw咖咖虾,以及全场景辅助驾驶系统HSD V1 6。这一
- 日榜
- 周榜
- 月榜
1
2
3
4
5
6
7
8
9
10
相关攻略
2015-03-10 11:25
2015-03-10 11:05
2021-08-04 13:30
2015-03-10 11:22
2015-03-10 12:39
2022-05-16 18:57
2025-05-23 13:43
2025-05-23 14:01
热门教程
- 游戏攻略
- 安卓教程
- 苹果教程
- 电脑教程
热门话题

