一、为啥要喝这碗“汤”?爬虫新手必看
很多刚学爬虫的朋友,面对网页上密密麻麻的HTML标签,第一反应可能是头皮发麻。比如你想抓取某电商网站的商品价格,结果代码长这样:
<div class="price-wrapper">
<span class="price-now">¥99.9</span>
<del class="price-old">¥199</del>
</div>
手动截取?正则表达式?别闹了!那感觉就像用筷子在火锅里捞芝麻,累死还捞不干净。Beautiful Soup(后文亲切叫它“汤师傅”)的厉害之处在于,它能把这些杂乱标签自动解析成树形结构,你只需告诉它:“我要class=‘price-now’的span标签”,它立马给你端上来!
举个例子对比:
- 原始方法:写正则
re.findall(r'<span class="price-now">(.*?)</span>', html) - “汤师傅”方法:
soup.find('span', class_='price-now').text
看出差距了吗?后者像用漏勺捞饺子,前者像在汤里徒手摸鱼……
二、解析器四大金刚:谁是你的“本命汤勺”?
“汤师傅”能炖汤,全靠解析器当勺子。常用的四把勺子各有脾气,选对了效率翻倍,选错了可能“锅糊了”!
- html.parser(原配勺子)
-
- 特点:Python自带,无需安装,兼容性强
- 缺点:速度慢,对复杂网页解析能力弱
- 适用场景:新手练手、简单静态页面
- 口语点评:“就像泡面附送的塑料叉,能用,但别指望它吃牛排!”
- lxml(不锈钢猛勺)
-
- 特点:C语言编写,解析速度最快,效率之王
- 缺点:需要单独安装(
pip install lxml) - 适用场景:99%的爬虫项目,尤其是大数据量需求
- 口语点评:“米其林大厨专用勺,快准狠!但得自己配。”
- html5lib(佛系养生勺)
-
- 特点:容错性极强,能修复残缺HTML
- 缺点:速度慢到让你怀疑人生
- 适用场景:解析古董级烂代码网页
- 口语点评:“像老中医熬药,慢工出细活,急脾气慎用!”
- xml(专属调料勺)
-
- 特点:专门解析XML格式
- 适用场景:爬取RSS订阅等XML内容
- 口语点评:“喝汤用不上,但煲药膳时必须!”
横向对比表:
|
解析器 |
速度 |
易用性 |
安装需求 |
推荐指数 |
|
html.parser |
慢 |
★★★★ |
Python内置 |
★★★☆☆ |
|
lxml |
快 |
★★★★★ |
需pip安装 |
★★★★★ |
|
html5lib |
极慢 |
★★★☆☆ |
需pip安装 |
★★☆☆☆ |
|
xml |
中等 |
★★★★☆ |
部分需安装 |
★★★★☆ |
选勺口诀:日常用lxml,偷懒用html.parser,摆烂用html5lib!
三、完整示例:手把手教你炖一锅“数据汤”
接下来,我们以爬取“豆瓣读书TOP250”为例(纯教学用途),展示“汤师傅”的完整工作流。
步骤1:备料——安装库
pip install beautifulsoup4 requests lxml
步骤2:点火——发送请求
import requests
from bs4 import BeautifulSoup
url = 'https://book.douban.com/top250'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
}
response = requests.get(url, headers=headers)
步骤3:炖汤——解析网页
# 重点!这里选用lxml解析器
soup = BeautifulSoup(response.text, 'lxml')
# 捞取所有图书条目(观察HTML结构后定位)
books = soup.find_all('div', class_='pl2')
for book in books:
# 提取书名(去除空格和换行)
title = book.find('a').text.strip().replace('\n', '')
# 提取评分
rating = book.find('span', class_='rating_nums').text
# 提取一句话简介
quote_tag = book.find_next_sibling('p')
quote = quote_tag.text if quote_tag else "暂无简介"
print(f"书名:{title},评分:{rating},简介:{quote}")
步骤4:调味——处理异常
实战中总会有意外,比如某些标签缺失:
for book in books:
try:
title = book.find('a').text.strip()
rating = book.find('span', class_='rating_nums').text
except AttributeError:
# 遇到部分数据缺失时跳过
continue
步骤5:喝汤——保存结果
import csv
with open('douban_books.csv', 'w', newline='', encoding='utf-8') as f:
writer = csv.writer(f)
writer.writerow(['书名', '评分', '简介'])
for book in books:
# ...(解析代码同上)
writer.writerow([title, rating, quote])
运行结果示例:
书名:活着,评分:9.4,简介:讲述了眼泪的宽广和丰富...
书名:1984,评分:9.3,简介:描写了一个令人窒息的恐怖世界...
四、防翻车指南:爬虫常见坑点
- 标签找不到?可能是动态加载
用“汤师傅”前,先用print(soup.prettify())看看网页是否完整获取。如果是JavaScript动态加载的内容,需要改用Selenium。 - 编码乱码?记得统一解码
在解析前加一句:response.encoding = 'utf-8' - 被封IP?加请求头+延时
headers = {'User-Agent': '你的浏览器UA'}
time.sleep(1) # 每次请求间隔1秒
五、总结:为啥“汤师傅”经久不衰?
在PySpider、Scrapy等框架横行的时代,Beautiful Soup依然是新手最爱的解析器,因为它:
- 学习成本低:像查字典一样找标签
- 容错性强:哪怕网页代码缺胳膊少腿也能解析
- 组合灵活:搭配Requests轻便上手,搭配Scrapy也能扛大旗
最后送大家一句话:“爬虫千万条,守法第一条;数据虽美味,访问需合规!” 记得遵守网站的robots.txt协议哦~

被折叠的 条评论
为什么被折叠?



