一、三者的本质区别(核心)
假设我们有一个请求:
import requests
res = requests.get("https://httpbin.org/json")
| 属性 / 方法 | 类型 | 本质 | 适用场景 |
|---|---|---|---|
res.content |
bytes(二进制字节) |
服务器返回的原始响应体,完全没经过处理 | 下载图片 / 文件、处理加密数据、未知编码文本 |
res.text |
str(字符串) |
res.content 经过requests 自动推测编码解码后的字符串 |
爬取网页源码、查看文本内容 |
res.json() |
dict / list |
把 res.content 用 json.loads() 解析后的 Python 对象 |
处理接口返回的 JSON 数据 |
二、三者的联系与转换关系
它们都是来自同一个源头:服务器返回的原始字节流。
服务器原始响应(bytes) → res.content↓(requests自动解码)res.text (str)↓(json.loads解析)res.json() (dict/list)
等价写法说明(这是重点这重!)
res.text等价于:# requests自动推测编码后的解码 res.content.decode(res.encoding)res.json()等价于:import json json.loads(res.content) # 或 json.loads(res.text) (前提是text的编码正确)
三、常见坑点与避坑指南
1. res.text 乱码问题
- 原因:requests 会自动根据响应头的
Content-Type或字节流猜测编码,猜错了就会乱码。 - 解决方法:手动指定编码解码:
# 方法1:修改res的编码 res.encoding = "utf-8" # 或 "gbk" print(res.text)# 方法2:直接从content解码(更可控) print(res.content.decode("utf-8"))
2. res.json() 报错问题
- 原因:响应不是标准 JSON 格式(比如返回 HTML 错误页、纯文本)。
- 报错:
json.decoder.JSONDecodeError - 解决方法:加异常捕获,同时看一下原始响应:
try:data = res.json() except Exception as e:print("解析JSON失败,原始响应:", res.text)raise e
四、实战对比代码
import requestsurl = "https://httpbin.org/json"
res = requests.get(url)print("=== res.content ===")
print(type(res.content)) # <class 'bytes'>
print(res.content[:100]) # 打印前100字节print("\n=== res.text ===")
print(type(res.text)) # <class 'str'>
print(res.text[:100]) # 打印前100字符print("\n=== res.json() ===")
print(type(res.json())) # <class 'dict'>
print(res.json()["slideshow"]["title"]) # 直接取字典里的值
五、一句话总结怎么选
- 要下载文件 / 图片 / 二进制数据 → 用
res.content - 要爬网页源码 / 纯文本 → 用
res.text(乱码就手动指定编码) - 要处理接口 JSON 数据 → 直接用
res.json()
