2013-10-08 2 views
3

Я выполняю проверку состояния через огромный список ссылок и мой фрагмент кода выглядит следующим образом:питона словарь ошибки ключа не могут решить

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

Вместо использования обозначения в скобках используйте словарь r.headers.get ('content-length') из словаря, который не будет бросать ключевую ошибку, а просто возвращает None.

Приятно, что вы можете использовать любую нотацию для извлечения значений из словаря. Много раз вы хотите, чтобы эта ключевая ошибка была выбрана, чтобы не допустить, чтобы проблема оставалась незамеченной. В этом случае, похоже, что dictionary.get() - это то, что вы хотите.

+0

Это идеальное .. .Оно работает!! Большое спасибо!! –

3

Ключевая ошибка обычно означает, что ключ не существует.

Я gessing, что self._store [key.lower()] [1] не является действительным (не существует)

Из официального питона документы:

exception KeyError

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

Смежные вопросы