刚刚开始学习python,我也开始学习它的基于Web的一面。
按照我的指示,我在第18行上不断收到KeyError:'title'。现在,我将其视为请求未返回标题,从而给出了错误,我将如何编写它以给出一般性描述如果没有“标题”?
import requests
from operator import itemgetter as ig
url = 'https://hacker-news.firebaseio.com/v0/topstories.json'
r = requests.get(url)
print("Status Code:", r.status_code)
submission_ids= r.json()
submission_dicts = []
for submission_id in submission_ids[:30]:
url= ("https://hacker-news.firebaseio.com/v0/item" + str(submission_id) + '.json')
submission_r = requests.get(url)
print(submission_r.status_code)
response_dict = submission_r.json()
submission_dict = {
'title': response_dict['title'],
'link': "https://news.ycombinator.com/item?id=" +str(submission_id),
'comments': response_dict.get('descendants', 0)
}
submission_dicts = sorted(submission_dicts, key= ig('comments'), reverse= True)
for submission_dict in submission_dicts:
print("\nTitle:", submission_dict['title'])
print("Discussion link:", submission_dict['link'])
print("Comments:", submission_dict['comments'])
状态码:200 401 追溯(最近一次通话):
中的文件“ C:\ Users \ Shit Head \ Documents \ Programming \ Tutorial Files \ hn_submissions.py”,第18行 'title':response_dict ['title'], KeyError:“标题” [在1.2秒内完成]
答案 0 :(得分:0)
按照我的指示,我在第18行上不断收到KeyError:'title'。现在,我将其视为请求未返回标题,从而给出了错误,我将如何编写它以给出一般性描述如果没有“标题”?
听起来您只是在寻找get
方法:
get(key[, default])
如果 key 在字典中,则返回 key 的值,否则返回 default 。如果未给出 default ,则默认为
None
,因此此方法永远不会引发KeyError
。
所以,代替这个:
'title': response_dict['title'],
...您这样做:
'title': response_dict.get('title', 'Generic Hacker News Submission'),
在幕后,这只是一种更方便的方式来编写无论如何您都可以完成的事情。以下内容几乎是等效的:
title = response_dict.get('title', 'Generic')
title = response_dict['title'] if title in response_dict else 'Generic'
if title in response_dict:
title = response_dict['title']
else:
title = 'Generic'
try:
title = response_dict['title']
except KeyError:
title = 'Generic'
这是值得知道的,因为Python通常仅在真正常见的情况下(例如在字典中查找内容)提供get
之类的快捷方式。如果要使用相同的操作,例如,一个列表可能为空或只有一个项目,或者文件可能存在或可能不存在,或者正则表达式可能返回与组字符串匹配的结果或可能返回None ,您需要做很多事情。