这一章的核心就是“如何从获取到的数据中提取我们想要的信息”。这一章介绍了三种主流的解析工具:
xpath、jsonpath和BeautifulSoup。
🪓 第一部分:XPath 解析
XPath 是一种在 XML 和 HTML 文档中查找信息的语言,功能强大且语法灵活。
1. 环境准备
- 浏览器插件:在 Chrome 浏览器中安装 XPath Helper 插件,方便在开发者工具中调试 XPath 路径。
- Python 库:安装
lxml库。pip install lxml -i https://pypi.douban.com/simple
2. 核心用法
- 导入库:
from lxml import etree - 创建解析对象:
- 解析本地文件:
html_tree = etree.parse('XX.html') - 解析服务器响应:
html_tree = etree.HTML(response.read().decode('utf-8'))
- 解析本地文件:
- 执行解析:
html_tree.xpath('xpath路径')
3. XPath 基本语法
| 语法 | 说明 | 示例 |
|---|---|---|
// | 查找所有子孙节点,不考虑层级 | //div |
/ | 查找直接子节点 | /div/p |
[@属性] | 谓词查询,根据属性筛选 | //div[@id] |
[@属性="值"] | 精确匹配属性值 | //div[@id="main"] |
//@属性 | 查询所有节点的指定属性 | //@class |
/text() | 获取标签内的文本内容 | //div/h1/text() |
contains() | 模糊查询,属性值包含某字符串 | //div[contains(@id, "he")] |
starts-with() | 模糊查询,属性值以某字符串开头 | //div[starts-with(@id, "he")] |
and | 逻辑运算,同时满足多个条件 | //div[@id="head" and @class="s_down"] |
| ` | ` | 逻辑运算,或 |
📦 第二部分:JsonPath 解析
当数据接口返回的是 JSON 格式时,使用 JsonPath 比正则表达式或字符串处理要高效得多。
1. 环境准备
- 安装库:
pip install jsonpath
2. 核心用法
- 加载 JSON 对象:
import json import jsonpath # 从文件加载 obj = json.load(open('data.json', 'r', encoding='utf-8')) # 或从字符串加载 # obj = json.loads(response_text) - 执行解析:
ret = jsonpath.jsonpath(obj, 'jsonpath语法')
Jsonpath使用参考http://blog.csdn.net/luxideyao/article/details/77802389
🍲 第三部分:BeautifulSoup 解析
BeautifulSoup(简称 bs4)是另一个非常流行的 HTML/XML 解析库,以接口设计人性化著称。
1. 核心简介
- 优点:接口设计人性化,使用方便,容错性强。
- 缺点:解析效率通常低于
lxml。
2. 环境准备与创建对象
- 安装库:
pip install bs4 - 导入库:
from bs4 import BeautifulSoup - 创建对象:
# 解析服务器响应 soup = BeautifulSoup(response.read().decode(), 'lxml') # 解析本地文件 (注意指定编码) soup = BeautifulSoup(open('1.html', encoding='utf-8'), 'lxml')
3. 节点定位(查找数据)
- 根据标签名查找:
soup.a:只能找到第一个<a>标签。
- find 系列方法:
find('a'):返回第一个匹配的标签对象。find('a', title='名字'):根据属性查找。find('a', class_='名字'):注意,因为class是 Python 关键字,所以要写成class_。find_all('a'):返回所有匹配的标签对象列表。find_all(['a', 'span']):查找所有<a>和<span>标签。find_all('a', limit=2):只查找前两个。
- select 方法(推荐):支持 CSS 选择器语法,功能强大。
- 标签选择器:
soup.select('p') - 类选择器:
soup.select('.firstname') - ID 选择器:
soup.select('#firstname') - 属性选择器:
soup.select('li[class]')或soup.select('li[class="value"]') - 层级选择器:
- 后代选择器:
div p(div 内部所有的 p) - 子选择器:
div > p(div 的直接子元素 p)
- 后代选择器:
- 组合选择器:
soup.select('div, span')(查找所有 div 和 span)
- 标签选择器:
4. 节点信息提取
- 获取文本内容:
obj.string:获取标签内的字符串。obj.get_text():推荐,能获取标签内所有文本,即使有嵌套标签。
- 获取标签名:
tag.name - 获取所有属性:
tag.attrs(返回一个字典) - 获取单个属性值:
obj.attrs.get('title'):常用,如果属性不存在返回None,不会报错。obj.get('title')obj['title']:如果属性不存在会报错。
📌 总结与建议
| 解析方式 | 适用场景 | 特点 |
|---|---|---|
| XPath | HTML/XML 文档 | 语法灵活,功能强大,效率高 |
| JsonPath | JSON 数据 | 处理 API 接口返回的 JSON 数据非常方便 |
| BeautifulSoup | HTML/XML 文档 | 接口友好,上手简单,容错性好 |