import requests, json
def getGenders(names):
url = ""
cnt = 0
if not isinstance(names,list):
names = [names,]
for name in names:
if url == "":
url = "name[0]=" + name
else:
cnt += 1
url = url + "&name[" + str(cnt) + "]=" + name
req = requests.get("https://api.genderize.io?" + url)
results = json.loads(req.text)
retrn = []
for result in results:
if result["gender"] is not None:
retrn.append((result["gender"], result["probability"], result["count"]))
else:
retrn.append((u'None',u'0.0',0.0))
return retrn
一切都工作了2天,我没有更改代码中的任何内容。我打开和关闭了不同的名字2天。突然间我收到了这个错误:
字符串索引必须是整数
在这一行:
if result["gender"] is not None:
首先,我想知道为什么会突然发生这种情况?第二,我该如何解决?
答案 0 :(得分:0)
通过字典迭代迭代字典中的键。
results = {"name":"peter","gender":"male","probability":"0.99","count":796}
[result for result in results] # ['count', 'gender', 'name', 'probability']
迭代列表会遍历列表中的项目。
results = [{"name":"peter","gender":"male","probability":"0.99","count":796}]
[result for result in results] # [{'count': 796, 'gender': 'male', 'name': 'peter', 'probability': '0.99'}]
根据https://genderize.io/的API描述,有两种响应格式:单个名称查找的json对象(json.loads
将作为字典返回),以及多个对象列表查找(json.loads
将作为字典列表返回)。
https://api.genderize.io/?name=peter
与
相比https://api.genderize.io/?name[0]=peter
看起来你的错误是在你期待第二种格式时以第一种格式获得响应的结果。为什么这会改变?这是您正在使用的API的问题。在我看来,您的请求应始终采用多名称请求格式,但我无法说明他们实际响应的方式。
至于修复此问题,您可以检查类型并将裸字典包装在列表中:
retrn = []
if not isinstance(results, list):
results =[results]
for result in results:
if result["gender"] is not None:
retrn.append((result["gender"], result["probability"], result["count"]))
else:
retrn.append((u'None',u'0.0',0.0))