【问题标题】:KeyError in While LoopWhile循环中的KeyError
【发布时间】:2018-06-05 20:09:06
【问题描述】:

我正在尝试遍历分页 URL。我在第一页找到分页 URL,转到它,在第二页找到它,转到它,依此类推,直到最后一页。但是,我得到一个 KeyError,这是由于最后一页没有分页导致的。但是,我认为我的等式会捕捉到这一点,因为我的陈述将是错误的并且循环停止。

response1 = requests.get("api.weather.gov/alerts?limit=100") # request API
data1 = response1.json()
pag_object1 = (data1['pagination']['next']) #find pagination object 

while ("pagination" in str(data1)) == True: # while string is found
    response1 = requests.get(pag_object1) # use 1st pag object to make new response
    data1 = response1.json()
    pag_object1 = (data1['pagination']['next']) # redefine pag object

错误:

KeyError: 'pagination'

【问题讨论】:

  • 为什么要检查它是否在str(data1) 中而不是检查它是否在data1 中?通过将 dict 转换为字符串表示,然后进行子字符串匹配,您将匹配 {'something': 'i have no pagination'} 之类的内容。但是,data1['pagination'] 当然会失败。
  • data1 = response1.json() 用新的字典覆盖 data1...
  • @abarnert 是的,但它在第 3 行有效。OP 用循环中的其他内容覆盖 data1。测试来得太晚了。
  • 没有看到data1 对象的实际内容,我无法确定发生了什么,但我认为data1 的字符串表示在某处包含字符串“分页” , 没有 data1 实际上包含“分页”键。你应该把你的测试改成while "pagination" in data1:
  • @bsam 仍然给出同样的错误。

标签: python loops if-statement while-loop python-2.6


【解决方案1】:

我相信问题如下,您在再次检查 while 循环的条件之前重新定义了 pag_object1。

我相信正在发生的事情:

  • data1 是倒数第二页,仍然包含“分页”对象
  • pag_object1 可以分配为 data1 包含一个名为“分页”的键
  • 虽然条件将评估为 True

最后一个循环:

  • data1 在最后一页,不包含键“分页”,但您仍然尝试在检查 while 循环的条件之前分配 pag_object1

这应该可以解决它:

response1 = requests.get("api.weather.gov/alerts?limit=100") # request API
data1 = response1.json()

# while the pagination string is in the keys 
while "pagination" in data1: 
    # assign the pagination object
    pag_object1 = (data1['pagination']['next']) 

    # use pag_object1 to create a new request for the next page
    response1 = requests.get(pag_object1) 

    # assign the new page to the data1 object
    data1 = response1.json()

【讨论】:

  • while ("pagination" in data1.keys()) == True: => while "pagination" in data1:
  • @Jean-FrançoisFabre:很酷,谢谢!我错过了。使用 keys() 编码风格是更好还是更差?它更冗长/明确。
  • python 2:keys返回一个列表,查找是O(n):缺少字典的点...
  • @Jean-FrançoisFabre:谢谢!现在这很有意义。
  • @meck 是的,这正是我想要的。我知道我的定义顺序不正确。您的回复以我无法理解的方式解释了它!
猜你喜欢
  • 2020-02-14
  • 1970-01-01
  • 1970-01-01
  • 2014-11-02
  • 1970-01-01
  • 1970-01-01
  • 2016-04-24
  • 2016-11-27
  • 1970-01-01
相关资源
最近更新 更多