python字典键错误无法解决

时间:2013-10-08 18:36:23

标签: python http python-2.7 dictionary python-requests

我正在对一大堆链接进行状态检查,我的代码如下:

link = 'http://xyz'
proxyDict = { "http" : "ip:80", "https" : "https://ip:443"}
r = requests.get(link, allow_redirects=False, verify=False)
http_status = r.status_code
print (r.headers)

# check the status and react accordingly

if http_status == 200 and r.headers['content-length'] == "0":
   print ('Link Alive - NO content'+';'+str(http_status)+';'+link, file = log)
elif http_status == 200 and "text/html" in r.headers['content-type']:
   print ('External- direct HTML link'+';'+str(http_status)+';'+link, file = log)  
elif http_status == 200 and "application" in r.headers['content-type']:
   print ('External- direct HTML link'+';'+str(http_status)+';'+link, file = log)

当我执行代码时,我收到以下错误:

    return self._store[key.lower()][1]
    KeyError: 'content-length'

标题输出如下:

CaseInsensitiveDict({'status': '200', path=/; HttpOnly, shpuvid=rBBcnFJUTliSHV+hA5lLAg==; expires=Thu, 08-Oct-15 18:26:32 GMT;'connection': 'keep-alive', 'cache-control': 'max-age=0, private, must-revalidate', 'date': 'Tue, 08 Oct 2013 18:26:32 GMT', 'content-type': 'text/html; charset=utf-8', 'x-rack-cache': 'miss'})

我知道错误的存在是因为header output没有关键字“内容长度”,但是当if condition不满足时,它必须跳转到下一个elif条件,而不是发生,而不是停止代码执行抛出上述错误。

有什么建议吗?可能是一个愚蠢的问题,但对初学者来说是一件好事。

3 个答案:

答案 0 :(得分:4)

不使用括号表示法,而是使用字典中的r.headers.get('content-length'),它不会引发键错误,只返回None。

很好,你可以使用任何一种表示法从字典中检索值。很多时候,您希望抛出关键错误,以免让问题被忽视。在这种情况下,看起来你想要的是dictionary.get()。

答案 1 :(得分:3)

键错误通常表示该键不存在。

我认为self._store [key.lower()] [1]无效(不存在)

来自官方python文档:

  

异常KeyError

     

在集合中找不到映射(字典)键时引发   现有密钥。

答案 2 :(得分:0)

问题可能出在请求本身内。

在将request.get()的多个调用定向到同一服务器时,请求包中存在一些异步行为,这会导致问题。

https://blog.petrzemek.net/2018/04/22/on-incomplete-http-reads-and-the-requests-library-in-python/