我使用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)
我认为处理它的一个好方法是使用operator.itemgetter()
创建一个可调用对象,它将尝试一次检索所有键,如果没有找到,它将生成一个KeyError
。
简短地说明我的意思:
from operator import itemgetter
test_dict = dict(name="The Shop", phone='123-45-6789', zipcode=90210)
keys = itemgetter('name', 'phone', 'zipcode')(test_dict)
print(keys) # -> ('The Shop', '123-45-6789', 90210)
keys = itemgetter('name', 'address', 'phone', 'zipcode')(test_dict)
# -> KeyError: 'address'