当前位置: 首页
业界动态
Python爬虫入门教程 使用BeautifulSoup抓取网页数据

Python爬虫入门教程 使用BeautifulSoup抓取网页数据

热心网友 时间:2026-05-24
转载

还在为使用正则表达式手动解析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等浏览器自动化工具来模拟用户操作。不过,这属于更进阶的爬虫技术,我们将在后续的文章中详细探讨。

来源:https://www.51cto.com/article/841653.html

游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

同类文章
更多
东软发布车载智能出行方案7.0与AI座舱平台

东软发布车载智能出行方案7.0与AI座舱平台

2026年北京国际车展于4月26日正式拉开帷幕。展会前夕,东软集团率先举办了智能汽车互联新品战略发布会,集中发布了其在智能汽车软件领域的一系列创新成果与战略布局。本次发布聚焦三大核心:全球车载智能出行解决方案OneCoreGo的重大版本迭代、全新AI座舱软件平台NAGIC AI的首次亮相,以及旗下子

时间:2026-05-24 22:44
比亚迪大唐预售首日订单破3万 D级旗舰SUV市场迎新标杆

比亚迪大唐预售首日订单破3万 D级旗舰SUV市场迎新标杆

24小时,3万台订单。比亚迪王朝网首款D级旗舰SUV“大唐”的预售成绩单,一公布就引发了市场热议。这个数字不仅刷新了品牌自身的预售纪录,更向整个高端新能源SUV市场投下了一枚重磅冲击波。 这款备受瞩目的新车,此前已披露了诸多硬核信息。作为王朝网的旗舰之作,大唐EV集成了比亚迪当前多项尖端技术,包括第

时间:2026-05-24 22:44
中国工业机器人出口激增 移动机器人海外市场加速拓展

中国工业机器人出口激增 移动机器人海外市场加速拓展

近期,海关总署发布的一组数据在行业内引发热议。统计显示,今年我国工业机器人出口增长势头强劲,其中4月份单月出口量首次突破2 5万台,同比增长接近90%。在这轮出海热潮中,移动机器人(AGV AMR)的表现格外突出,已成为彰显“中国智造”实力的重要名片。 这一出口增长态势的背后,反映了全球市场需求的差

时间:2026-05-24 22:44
尚界Z7T顶棚问题引热议 博主现场拆解视频动机成焦点

尚界Z7T顶棚问题引热议 博主现场拆解视频动机成焦点

2025年北京国际车展现场,一段关于尚界Z7内饰体验的短视频在各大社交平台引发热议。然而,这次传播的焦点并非产品亮点,而是一种极具争议的交互演示方式,迅速成为公众讨论与行业反思的焦点。 视频画面显示,某平台体验人员在拍摄过程中,用手部施加较大力量扒开了尚界Z7顶棚内饰的边缘接缝处。这一片段经网络快速

时间:2026-05-24 22:43
地平线推出全新智能驾驶底座方案车企会买单吗

地平线推出全新智能驾驶底座方案车企会买单吗

地平线创始人余凯 在今年的北京车展上,地平线向业界传递了一个清晰的战略信号:它已不再满足于仅仅扮演产业链中的“部件供应商”角色。 这家以智能驾驶芯片著称的科技公司,集中发布了中国首款舱驾融合整车智能体芯片“星空”、整车智能体操作系统KaKaClaw咖咖虾,以及全场景辅助驾驶系统HSD V1 6。这一

时间:2026-05-24 22:43
热门专题
更多
刀塔传奇破解版无限钻石下载大全 刀塔传奇破解版无限钻石下载大全
洛克王国正式正版手游下载安装大全 洛克王国正式正版手游下载安装大全
思美人手游下载专区 思美人手游下载专区
好玩的阿拉德之怒游戏下载合集 好玩的阿拉德之怒游戏下载合集
不思议迷宫手游下载合集 不思议迷宫手游下载合集
百宝袋汉化组游戏最新合集 百宝袋汉化组游戏最新合集
jsk游戏合集30款游戏大全 jsk游戏合集30款游戏大全
宾果消消消原版下载大全 宾果消消消原版下载大全
  • 日榜
  • 周榜
  • 月榜
热门教程
更多
  • 游戏攻略
  • 安卓教程
  • 苹果教程
  • 电脑教程