首页 > 编程问答 >Python 请求 - response.json() 未按预期工作

Python 请求 - response.json() 未按预期工作

时间:2024-07-28 05:53:08浏览次数:11  
标签:python json python-requests

我正在尝试从 Python 的 requests 模块调用 API。在邮递员上,返回的响应标头中的 Content-Type 是 application/json; charset=utf-8 ,响应 json 数据是我期望的样子。但是,在 python 上的 API 的 get 方法之后运行 response.json() 会抛出错误 simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

希望有人能帮助解释为什么会发生这种情况。

Postman 返回的内容的前几行:

{
    "Pagination": {
        "query": "",
        "index": "PRODUCTION_PG_FEATURED_DESC",
        "limit": "100",
        "page": 1,
        "total": 8556,
        "lastPage": "/api/v3/browse?_tags=adidas&page=10&productCategory=sneakers&resultsPerPage=100",
        "sort": [
            "featured"
        ],
        "order": [
            "DESC"
        ],
        "currentPage": "/api/v3/browse?_tags=adidas&page=1&productCategory=sneakers&resultsPerPage=100",
        "nextPage": "/api/v3/browse?_tags=adidas&page=2&productCategory=sneakers&resultsPerPage=100",
        "previousPage": null
    }, 

我的代码块:

import requests

productsAPI = 'https://stockx.com/api/browse?_tags=nike&productCategory=sneakers&page=1&resultsPerPage=100'
headers = {"accept": "*/*", "accept-language": "en-US,en;q=0.9", "accept-encoding" : "gzip, deflate, br","User-Agent" :"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.76 Safari/537.36", 
        "Connection" : "keep-alive"}
response = requests.get(productsAPI, headers = headers)
print(response.text)
        
if response.status_code != 200:
    print(response.status_code)
try: 
    data = response.json()
except:
    print('fail')

print(data["Facets"]["brand"])


问题出在尝试访问 response.json() 数据的方式上。虽然响应看起来像 JSON,但出现 JSONDecodeError 表明实际返回的可能不是有效的 JSON。

正在遇到错误,因为正在尝试在不存在的字典中访问一个键。 response.json() 提供的 JSON 数据不包含名为 'Facets' 的顶级键。因此, data["Facets"]["brand"] 会导致错误。

可以通过在 try...except 块中打印 data 来进行调试并检查 response.json() 的结构。

调试步骤:

  1. 打印 data try...except 块中,在引发错误的行之前添加 print(data) 。这将显示从 response.json() 返回的实际 Python 数据结构。 python try: data = response.json() print(data) # 打印数据以检查其结构 print(data["Facets"]["brand"]) except: print('fail')
  2. 检查结构: 根据打印的输出,检查实际键和嵌套结构。查找包含“brand”值的正确路径。
  3. 更正访问方式: 根据正确的结构更新代码,以访问所需的数据。例如,如果“brand”位于名为 'products' 的列表中的字典中,则可以使用循环访问它: python for product in data['products']: print(product['brand'])

其他提示:

  • 状态码检查: 虽然正在检查状态码 200 ,但最好处理其他成功代码(如 201 Created )并为不同的错误代码提供更具体的错误消息。
  • 错误处理: 考虑使用更具体的异常处理。不要捕获通用的 except ,而是捕获 json.JSONDecodeError 以仅处理 JSON 解码错误,并允许其他错误引发。

通过遵循这些步骤,可以调试代码并从 response.json() 中正确提取“brand”数据。

标签:python,json,python-requests
From: 68387607

相关文章

  • Python 中的“样板”代码?
    Google有一个Python教程,他们将样板代码描述为“不幸的”,并提供了以下示例:#!/usr/bin/python#importmodulesusedhere--sysisaverystandardoneimportsys#Gatherourcodeinamain()functiondefmain():print'Hellothere',sys.argv[1]#Command......
  • Python 3.9.1 中的 collections.abc.Callable 是否有 bug?
    Python3.9包含PEP585并弃用typing模块中的许多类型,转而支持collections.abc中的类型,现在它们支持__class_getitem__例如Callable就是这种情况。对我来说,typing.Callable和collections.abc.Ca......
  • 列表子类的 Python 类型
    我希望能够定义列表子类的内容必须是什么。该类如下所示。classA(list):def__init__(self):list.__init__(self)我想包含键入内容,以便发生以下情况。importtypingclassA(list:typing.List[str]):#Maybesomethinglikethisdef__init__(self):......
  • Python 中类型友好的委托
    考虑以下代码示例defsum(a:int,b:int):returna+bdefwrap(*args,**kwargs):#delegatetosumreturnsum(*args,**kwargs)该代码运行良好,只是类型提示丢失了。在Python中使用*args,**kwargs来实现​​委托模式是很常见的。如果有一种方法可......
  • 使用 python 支持构建自定义 vim 二进制文件
    背景Debian11vim软件包不包含python3支持。请参阅标题为“Debian11vim中不支持python-证据”的部分下面我需要vim支持python3YouCompleteMevim插件为了构建一个新的,我将vim9.0tarball下载到v......
  • 如何在Python 3.12+中正确使用泛型来提高代码质量?
    我正在尝试使用泛型来改进FastAPI应用程序中的类型注释。我有一个抽象存储库类,在其中使用泛型:fromabcimportABC,abstractmethodfromtypingimportListclassAbstractRepository[T](ABC):@abstractmethodasyncdefadd_one(self,data:dict)->T:......
  • python中的while循环不退出
    我试图完成第一年的python商业课程作业,但我的while循环无法退出,有人能帮忙吗?commisionTable=[{"admin_fee":100,"comm_rate":0.10},{"admin_fee":125,"comm_rate":0.12},{"admin_fee":150,"comm_rate":......
  • python---json文件写入
    ​ 使用到的知识点:os模块执行linux指令、json.dump()、withopenasf代码实现importsysimportosimportjson #向json文件file中添加内容data,其中data的类型为字典defwrite_json(file,data):    #如果文件存在,则删除    if(os.path.exists(fi......
  • python错题记录:布尔运算与逻辑值检测
    一前言环境:python3.10win10二布尔运算与逻辑值检测1案例案例1如上,在布尔运算时,有些时候代码只会运算前面的一部分,剩下的部分根本不会运算。以前在练习算法代码时,就利用这个规则来减少代码的工作量案例2如上,之前好长一段时间,上面的布尔运算总是让我感到困惑布尔运......
  • python---字典遍历
    1、三种常见的字典遍历实现defget_key_value(dics):  '''遍历所有键值对'''  forkey,valueindics.items():    print(f"{key}:{value}")defget_keys(dics):  '''遍历所有的键'''  forkeyindics......