2015-08-26 6 views
2

Я пытаюсь разобрать JSON, ниже мой код.TypeError: строковые индексы должны быть целыми при разборе JSON, Python?

import requests 
import json 
yatoken = '123123sdfsdf' 
listOfId = ['11111111111', '2222222222', '33333333333'] 
for site in listOfId: 
    r = requests.get('http://api.ya-bot.net/projects/' + site + '?token=' + yatoken) 
parsed = json.loads(r.text) 

for url in parsed['project']: 
    #print url 
    print str(url['name']) 

И JSON:

{ 
"project":{ 
"id":"123123sdfsdfs", 
"urls":[], 
"name":"Имя", 
"group":"Группа", 
"comments":"", 
"sengines":[], 
"wordstat_template":1, 
"wordstat_regions":[] 
} 
} 

Это дает эта ошибка

print str(url['name']) 
TypeError: string indices must be integers 

Как я могу исправить эту проблему? Thx.

+1

Только так вы знаете, вы можете заменить 'разобран = JSON .loads (r.text) 'с' parsed = r.json() ', запросы имеют встроенный. – CasualDemon

ответ

1

for url in parsed['project'] возвращает Dict, так что вы на самом деле итерацию над keys в Словаре так "id"["name"] и т.д .. будет ошибка, вы можете использовать d = parsed['project'], чтобы получить Dict затем получить доступ к Dict ключом, чтобы получить то, что значение, которое вы хотите.

d = parsed['project'] 
print(d["name"]) 
print(d["urls"]) 
... 

или итерацию по элементам, чтобы получить ключ и значение:

for k, v in parsed['project'].items(): 
    print(k,v) 

Если вы печатаете то, что возвращается вы можете увидеть то, что происходит:

In [17]: js = { 
"project":{ 
"id":"123123sdfsdfs", 
"urls":[], 
"name":"Имя", 
"group":"Группа", 
"comments":"", 
"sengines":[], 
"wordstat_template":1, 
"wordstat_regions":[] 
} 
} 

In [18]: js["project"] # dict 
Out[18]: 
{'comments': '', 
'group': 'Группа', 
'id': '123123sdfsdfs', 
'name': 'Имя', 
'sengines': [], 
'urls': [], 
'wordstat_regions': [], 
'wordstat_template': 1} 

In [19]: for k in js["project"]: # iterating over the keys of the dict 
    ....:  print(k) 
    ....:  
sengines # k["name"] == error 
id 
urls 
comments 
name 
wordstat_regions 
wordstat_template 
group 
0

'project' ключ относится в словарь. Зацикливание над этим словарем дает вам ключей, каждая строка. Вы не перебираете список URL-адресов. Один из этих ключей будет 'name'

Ваш код путает иначе. Кажется, вы хотите получить каждый URL-адрес. Чтобы сделать это, вам придется перебрать в 'urls' ключа в этом вложенном словаре:

for url in parsed['project']['urls']: 
    # each url value 

В своем ответе образца, что список пуст однако.

Если вы хотите, чтобы получить 'name' ключ из вложенного словаря, просто напечатать его без зацикливания:

print parsed['project']['name'] 

Демо:

>>> import json 
>>> parsed = json.loads('''\ 
... { 
... "project":{ 
... "id":"123123sdfsdfs", 
... "urls":[], 
... "name":"Имя", 
... "group":"Группа", 
... "comments":"", 
... "sengines":[], 
... "wordstat_template":1, 
... "wordstat_regions":[] 
... } 
... } 
... ''') 
>>> parsed['project'] 
{u'group': u'\u0413\u0440\u0443\u043f\u043f\u0430', u'name': u'\u0418\u043c\u044f', u'wordstat_regions': [], u'comments': u'', u'urls': [], u'sengines': [], u'id': u'123123sdfsdfs', u'wordstat_template': 1} 
>>> parsed['project']['name'] 
u'\u0418\u043c\u044f' 
>>> print parsed['project']['name'] 
Имя 
>>> print parsed['project']['urls'] 
[] 
+0

Спасибо! У меня есть другой вопрос: как я могу получить «имя» этого спискаOFId = ['11111111111', '2222222222', '33333333333']? Без цикла? – Anton

+0

У меня нет понятия, что вы просите. –

+0

извините. у нас есть 3 'id': '11111111111', '2222222222', '33333333333'. Я хочу получить 3 'имена' и использовать это: для сайта в listOfId. Но я получаю 1 результат – Anton