当前位置:首页>python>Python爬虫必备:数据提取方法全攻略

Python爬虫必备:数据提取方法全攻略

  • 2026-09-18 23:13:52
Python爬虫必备:数据提取方法全攻略

JSON、正则、XPath、JSONPath、BeautifulSoup4 五大利器详解

数据提取是爬虫的核心环节。本文详细介绍五种主流数据提取方法:JSON(处理结构化数据)、正则表达式、XPath、JSONPath、BeautifulSoup4(处理非结构化HTML)。掌握这些方法,让你的爬虫如虎添翼!

一、数据结构分类

📊 结构化数据

格式:JSON、XML
处理:json.dumps/loads

📄 非结构化数据

格式:HTML、文本
处理:正则、XPath、BS4

二、JSON 数据提取

💡 什么是 JSON?

JSON(JavaScript Object Notation)是一种轻量级数据交换格式,易于阅读和编写,方便机器解析和生成。常用于前后端数据交互场景。

字典 → JSON 字符串

import json

# json.dumps: Python字典 → JSON字符串
# indent=2: 缩进2空格
# ensure_ascii=False: 中文保持原样

json_str = json.dumps(mydict, indent=2, ensure_ascii=False)

JSON 字符串 → 字典

import json

# json.loads: JSON字符串 → Python字典
my_dict = json.loads(json_str)

三、XPath 数据提取

💡 什么是 XPath?

XPath(XML Path Language)即XML路径语言,最初用于在XML文档中查找信息,现也适用于HTML文档。XPath将整个DOM视为树形结构进行定位,能轻松实现各种数据定位需求。

XPath 核心语法

符号
说明
/
从根节点选取,或元素间的过渡
//
从当前节点选择文档中任意位置的节点
.
选取当前节点
..
选取当前节点的父节点
@
选取属性
text()
选取文本内容

XPath 路径表达式示例

表达式
说明
/bookstore
选取根元素 bookstore
//book
选取所有 book 子元素
//book/title/@lang
选择所有 book 下 title 的 lang 属性
//book/title/text()
选择所有 book 下 title 的文本
//title[@lang="eng"]
选择 lang 属性为 eng 的 title
/bookstore/book[1]
选取第1个 book 元素
/bookstore/book[last()]
选取最后1个 book 元素
//book/title[text()='Harry Potter']
选择文本为 Harry Potter 的 title

XPath 实战示例

from lxml import etree

text = '''
<div><ul>
<li class="item-1"><a>first item</a></li>
<li class="item-1"><a href="link2.html">second item</a></li>
<li class="item-inactive"><a href="link3.html">third item</a></li>
<li class="item-1"><a href="link4.html">fourth item</a></li>
</ul></div>'''


html = etree.HTML(text)

# 提取 href 属性
href_list = html.xpath("//li[@class='item-1']/a/@href")

# 提取文本内容
title_list = html.xpath("//li[@class='item-1']/a/text()")

🎯 XPath 使用要点

✅ 安装:pip install lxml
✅ 导包:from lxml import etree
✅ 解析:etree.HTML(text)
✅ 提取:data.xpath("//div/text()")
⚠️ 注意:返回结果都是列表类型

四、JSONPath 数据提取

JSONPath 类似于 XPath,但专门用于解析多层嵌套的 JSON 数据。对于复杂的 JSON 结构,JSONPath 能快速定位提取所需数据。

语法对照表(XPath vs JSONPath)

功能
XPath
JSONPath
根节点
/$
当前节点
.@
获取子节点
/. 或 []
全局模糊匹配
//..
通配全部节点
**
数组下标
[][]
多选多条件
|[,]
过滤筛选
[]?()

五、正则表达式

💡 什么是正则表达式?

正则表达式(Regular Expression)是一种强大的文本匹配工具,通过特殊符号组合成"模式"来描述和匹配字符串。适用于处理复杂的、不规则的文本数据。

Python 中使用正则

import re

# match: 从字符串开头匹配
result = re.match(pattern, string)

# search: 搜索整个字符串,找到第一个匹配
result = re.search(pattern, string)

# findall: 找出所有匹配,返回列表
results = re.findall(pattern, string)

# sub: 替换匹配的内容
new_string = re.sub(pattern, repl, string)

常用元字符

元字符
说明
示例
.
匹配任意字符(除换行)
a.c
 匹配 abc
\d
匹配数字
\d{11}
 匹配11位数字
\w
匹配字母、数字、下划线
\w+
 匹配单词
\s
匹配空白字符
\s+
 匹配空格
^
匹配字符串开头
^hello
 开头是hello
$
匹配字符串结尾
world$
 结尾是world
*
匹配0次或多次
ab*c
 匹配 ac、abc
+
匹配1次或多次
ab+c
 匹配 abc、abbc
?
匹配0次或1次
colou?r
 匹配 color
[]
字符集,匹配其中的任意字符
[aeiou]
 匹配元音
()
分组,提取匹配的部分
(\d+)
 提取数字
|
或,匹配左右任意一个
cat|dog
 匹配 cat 或 dog

实战示例:提取手机号和邮箱

import re

text ="联系方式:13812345678,邮箱 test@163.com"

# 提取手机号(11位数字)
phone = re.findall(r'1[3-9]\d{9}', text)
# 结果: ['13812345678']

# 提取邮箱
email = re.findall(r'\w+@\w+\.\w+', text)
# 结果: ['test@163.com']

# 提取标题内容
html ='<title>Python教程</title>'
title = re.findall(r'<title>(.*?)</title>', html)
# 结果: ['Python教程']

🎯 正则表达式使用要点

✅ 导包:import re
✅ match() → 开头匹配
✅ search() → 搜索第一个
✅ findall() → 查找所有
✅ sub() → 替换内容
✅ 使用 r 前缀避免转义
⚠️ 复杂场景优先考虑 XPath/BS4

六、BeautifulSoup4 数据提取

💡 什么是 BS4?

BeautifulSoup4 简称 BS4,是一个 HTML/XML 解析器。BS4 基于 DOM 树,API 非常人性化,支持 CSS 选择器,使用简单直观。

安装:pip install bs4

基本使用

from bs4 import BeautifulSoup

soup = BeautifulSoup(html, "lxml")
# 格式化输出
print(soup.prettify())

find_all 方法参数

参数
说明
name
标签名称(字符串、正则、列表)
attrs
根据属性搜索(字典)
string
搜索字符串内容
limit
限制返回数量
其他
recursive=True 递归搜索

find 方法

soup.find('title')

返回第一个匹配结果

find_all 方法

soup.find_all('a')

返回所有匹配的列表

CSS 选择器

选择器
写法
示例
标签选择器
标签名soup.select('a')
类选择器
.class名soup.select('.sister')
ID选择器
#id名soup.select('#link1')
层级选择器
空格分隔soup.select('p #link1')
属性选择器
标签[属性]soup.select('a[class]')

获取数据

# 获取文本内容
for tag in soup.select('title'):
print(tag.get_text())

# 获取属性
for tag in soup.select('a'):
print(tag.get('href'))

实战示例:提取新闻列表

from bs4importBeautifulSoup

html ='''
<div class="news-list">
<h2 class="title">Python入门教程</h2>
<ul>
<li class="item">
<a href="/python/1.html">第一章:变量</a>
</li>
<li class="item">
<a href="/python/2.html">第二章:循环</a>
</li>
<li class="item">
<a href="/python/3.html">第三章:函数</a>
</li>
</ul>
</div>'''


soup = BeautifulSoup(html,'lxml')

# 方法1:find + find_all
news_div = soup.find('div', class_='news-list')
title = news_div.find('h2', class_='title').get_text()
items = news_div.find_all('li', class_='item')

# 方法2:CSS选择器(更简洁)
title = soup.select_one('.news-list .title').get_text()
links = soup.select('.item a')

# 提取数据
forlinkinlinks:
    item = {
'title': link.get_text(),
'href': link.get('href')
    }
print(item)

🎯 BeautifulSoup4 使用要点

✅ 安装:pip install bs4
✅ 导包:from bs4 import BeautifulSoup
✅ 解析:BeautifulSoup(html)
✅ find → 返回单个对象
✅ find_all/select → 返回列表
✅ get_text() → 获取文本
✅ get('属性名') → 获取属性

📌 五种方法对比总结

方法
适用场景
特点
JSON
API 结构化数据
简单直接,解析最快
正则
不规则文本、细节提取
灵活强大,上手较难
XPath
HTML/XML 文档
定位精准,可复制路径
JSONPath
深层嵌套 JSON
多层嵌套快速定位
BS4
HTML 文档
API 友好,CSS 选择器

💡 作者推荐

推荐优先使用 BeautifulSoup4,CSS 选择器写法直观易上手。
其次推荐 XPath,可从浏览器开发者工具直接复制路径。
正则表达式适合处理不规则的文本数据,功能强大但语法较复杂。

觉得有用请点赞收藏 ⭐
欢迎转发分享

最新文章

随机文章