爬虫数据清洗全攻略:正则、BeautifulSoup、XPath、jsonpath四大神技解析
数据清洗是爬虫工程的核心环节,掌握正则、BeautifulSoup、XPath和jsonpath四大技术,能让你在面对各种数据源时游刃有余。
在大数据时代,爬虫技术已成为获取信息的核心手段。但原始数据往往杂乱无章,如何高效清洗数据成为每个爬虫工程师的必修课!本文将深入剖析四大数据清洗神器,助你轻松驾驭海量数据!
目录
一、数据分类与处理策略
在爬虫世界中,数据主要分为两类:
-
结构化数据:JSON/XML等格式
-
特点:有固定格式,易于解析
-
处理方式:直接转换Python数据类型
-
-
非结构化数据:HTML文本
-
特点:无固定格式,需特定解析技术
-
处理方式:正则表达式、BeautifulSoup、XPath
-
二、JSON数据处理四剑客
| 方法 | 输入 | 输出 | 典型场景 | 执行效率 |
|---|---|---|---|---|
json.loads() |
JSON字符串 | Python数据类型 | 解析API返回的JSON | ⭐⭐⭐⭐ |
json.dumps() |
Python数据类型 | JSON字符串 | 向API发送数据 | ⭐⭐⭐⭐ |
json.load() |
类文件对象(含JSON) | Python数据类型 | 读取本地JSON文件 | ⭐⭐⭐ |
json.dump() |
Python数据类型 | 类文件对象(写入JSON) | 保存数据到JSON文件 | ⭐⭐⭐ |
import json
# JSON字符串 → Python字典
data_dict = json.loads('{"name": "John", "age": 30}')
# Python字典 → JSON字符串
json_str = json.dumps({"city": "New York"})
# 文件读写操作
with open('data.json') as f:
data = json.load(f)
with open('output.json', 'w') as f:
json.dump(data, f)
三、四大数据清洗技术详解
1. 正则表达式:文本处理的瑞士军刀
适用场景:快速提取特定模式文本、处理无固定结构数据
import re
# 豆瓣电影数据清洗实战
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"}
url = "https://movie.douban.com/top250"
# 编译正则表达式(提高效率)
pattern = re.compile(
r'<div class="item">.*?<img.*?src=[\'"](?P<address>.*?)[\'"].*?'
r'<span class="title">(?P<name>.*?)</span>.*?'
r'<p>.*?导演:(?P<director>.*?) .*?<br>',
re.S # 匹配换行符
)
response = requests.get(url, headers=headers)
data = pattern.finditer(response.text)
for item in data:
print(f"电影:{item.group('name')}")
print(f"导演:{item.group('director').strip()}")
print(f"海报:{item.group('address')}\n")
常用元字符速查表:
| 字符 | 说明 | 示例 |
|---|---|---|
\d |
数字 | \d{3}匹配123 |
\w |
字母/数字/下划线 | \w+匹配word |
. |
任意字符(除换行) | a.c匹配abc |
* |
0次或多次 | ab*匹配a,ab |
+ |
1次或多次 | ab+匹配ab |
? |
0次或1次 | ab?匹配a,ab |
() |
捕获分组 | (ab)+匹配abab |
(?P<name>) |
命名分组 | 见上方案例 |
2. BeautifulSoup:HTML解析的优雅之道
适用场景:处理复杂HTML文档、需要易读代码的场景
BeautifulSoup核心方法:
# 根据标签属性查找
soup.find('div', class_='header') # 查找class="header"的div
soup.find(id='main-content') # 根据ID查找
# CSS选择器
soup.select('div.item > a.title') # 层级选择
# 内容提取技巧
element.text # 获取所有文本(包括子标签)
element.get_text(separator='|') # 自定义分隔符
element['href'] # 获取属性值
3. XPath:精准定位的XML利器
适用场景:需要精确定位节点、处理XML数据、复杂结构文档
from lxml import etree
html = etree.HTML('''
<div>
<ul>
<li class="book"><a href="/book1">Python入门</a><span>¥59.8</span></li>
<li class="book"><a href="/book2">爬虫实战</a><span>¥79.0</span></li>
</ul>
</div>
''')
# 提取书籍信息
books = []
for book in html.xpath('//li[@class="book"]'):
books.append({
'title': book.xpath('./a/text()')[0],
'price': book.xpath('./span/text()')[0],
'link': book.xpath('./a/@href')[0]
})
XPath高效定位技巧:
//div[@id="content"] # 按ID精准定位
//a[contains(@class, "btn")] # 模糊匹配class
//h1/text() # 提取直接文本
//div[last()] # 选择最后一个div
//*[starts-with(@href, "/news")] # 匹配href开头
4. jsonpath:JSON数据挖掘神器
适用场景:处理多层嵌套JSON、批量提取特定字段
from jsonpath import jsonpath
data = {
"store": {
"books": [
{"title": "Python基础", "price": 59.8},
{"title": "爬虫进阶", "price": 79.0}
],
"location": "北京"
}
}
# 一键提取所有书名
titles = jsonpath(data, '$..books[*].title')
print(titles) # 输出:['Python基础', '爬虫进阶']
jsonpath语法精要:
| 表达式 | 说明 | 示例 |
|---|---|---|
$ |
根节点 | $.store.books |
@ |
当前节点 | 在过滤表达式中使用 |
.. |
递归搜索 | $..title |
* |
通配符 | $.store.* |
[] |
下标操作/过滤 | $.books[0].title |
?() |
过滤表达式 | $..books[?(@.price>60)] |
四、四大技术对比与选型指南
| 技术 | 处理速度 | 学习曲线 | 适用场景 | 推荐指数 |
|---|---|---|---|---|
| 正则表达式 | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ | 简单文本提取、模式匹配 | ⭐⭐⭐ |
| BeautifulSoup | ⭐⭐ | ⭐⭐ | 复杂HTML解析、代码可读性要求高 | ⭐⭐⭐⭐ |
| XPath | ⭐⭐⭐⭐ | ⭐⭐⭐ | 精准节点定位、XML处理 | ⭐⭐⭐⭐ |
| jsonpath | ⭐⭐⭐⭐ | ⭐⭐ | 多层嵌套JSON数据提取 | ⭐⭐⭐⭐ |
选型建议:
-
简单文本提取:正则表达式(如提取邮箱、电话)
-
复杂HTML解析:BeautifulSoup(需易读代码时)
-
精准元素定位:XPath(与lxml配合最佳)
-
深度JSON挖掘:jsonpath(处理API返回数据)
五、结语
数据清洗是爬虫工程的核心环节,掌握正则、BeautifulSoup、XPath和jsonpath四大技术,能让你在面对各种数据源时游刃有余。实际开发中建议:
-
首选XPath处理HTML/XML(精准高效)
-
次选BeautifulSoup(代码可读性好)
-
简单文本用正则(快速直接)
-
复杂JSON用jsonpath(一键提取)
技术没有绝对优劣,灵活组合才是王道!欢迎在评论区分享你的数据清洗实战经验~
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐



所有评论(0)