2013-10-08 84 views
3

我发现有很多链接列表进行状态检查,我的片段如下:Python字典键错误无法解决

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'}) 

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

有什么建议吗?可能是一个愚蠢的问题,但一个初学者学习的好东西。

回答

3

使用r.headers.get('content-length')来代替使​​用括号表示法,它不会抛出关键错误,而只返回None。

它很好,你可以使用任何符号来检索字典中的值。很多时候,你想要抛出重大错误,以免让人忽视问题。在这种情况下,看起来dictionary.get()就是你想要的。

+0

这是完美的.. 。有用!!非常感谢!! –

3

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

我gessing是self._store [key.lower()] [1]是无效的(不存在)

来自官方的Python文档:

exception KeyError

Raised when a mapping (dictionary) key is not found in the set of existing keys.