python中的response.content,response.json,response.text三者的区别与联系

一、三者的本质区别(核心)

假设我们有一个请求:
import requests
res = requests.get("https://httpbin.org/json")
 
 
属性 / 方法 类型 本质 适用场景
res.content bytes(二进制字节) 服务器返回的原始响应体,完全没经过处理 下载图片 / 文件、处理加密数据、未知编码文本
res.text str(字符串) res.content 经过requests 自动推测编码解码后的字符串 爬取网页源码、查看文本内容
res.json() dict / list res.contentjson.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 requests

url = "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()
posted @ 2026-05-15 19:30  chenlight  阅读(19)  评论(0)    收藏  举报