【发布时间】:2021-11-03 20:16:12
【问题描述】:
我正在使用 API 来获取有关我所在地区商店的基本信息、商店名称、地址、邮政编码、电话号码等……API 返回一个关于每个商店的长列表,但我只想要一些数据从每个商店。
我创建了一个 for 循环,它只为 API 返回的每个商店获取我想要的信息。这一切都很好。
问题不是所有的商店都有电话号码或网站,所以我得到一个KeyError,因为在商店的每次退货中都不存在密钥website。我尝试使用try 和except,但前提是我只处理一件事,但商店可能没有电话号码和网站,这会导致第二个KeyError。
如何检查for 循环中的每个键,如果发现缺少键,只需添加值"none"?
我的代码:
import requests
import geocoder
import pprint
g = geocoder.ip('me')
print(g.latlng)
latitude, longitude = g.latlng
URL = "https://discover.search.hereapi.com/v1/discover"
latitude = xxxx
longitude = xxxx
api_key = 'xxxxx' # Acquire from developer.here.com
query = 'food'
limit = 12
PARAMS = {
'apikey':api_key,
'q':query,
'limit': limit,
'at':'{},{}'.format(latitude,longitude)
}
# sending get request and saving the response as response object
r = requests.get(url = URL, params = PARAMS)
data = r.json()
#print(data)
for x in data['items']:
title = x['title']
address = x['address']['label']
street = x['address']['street']
postalCode = x['address']['postalCode']
position = x['position']
access = x['access']
typeOfBusiness = x['categories'][0]['name']
contacts = x['contacts'][0]['phone'][0]['value']
try:
website = x['contacts'][0]['www'][0]['value']
except KeyError:
website = "none"
resultList = {
'BUSINESS NAME:':title,
'ADDRESS:':address,
'STREET NAME:':street,
'POSTCODE:':postalCode,
'POSITION:':position,
'POSITSION2:':access,
'TYPE:':typeOfBusiness,
'PHONE:':contacts,
'WEBSITE:':website
}
print("--"*80)
pprint.pprint( resultList)
【问题讨论】:
-
-
这也是我尝试过的,但来自 API 的一些数据是数据列表,
.get不起作用。例如'contacts': [{'phone': [{'value': '+447415029531'}]}] -
这是简单键的小例子:值对,对于其他对,您需要添加更多过滤器以获得您想要的确切数据
-
我可以很好地获取数据,我正在寻找如何为我的 for 循环中的所有变量处理
KeyError,因为并非每个商店都有网站或电话号码 -
正如@sahasrara62 所写,使用
dict.get(key, None)就像这样:website = x.get("contacts",[{}])[0].get("www", [{}])[0].get("value", None)这样您就不必处理错误,因为不会引发错误
标签: python api dictionary keyerror