Ошибка типа: индексы списка должны быть целыми числами или срезами, а не str для больших данных

#python

Вопрос:

Этот код будет работать, если идентификатор предназначен для пользователя с меньшим количеством значков(например, ввод значения 2 для идентификатора игрока). Однако это не будет работать для игроков с большим количеством значков (например, идентификатор игрока 261) и покажет ошибку: «Ошибка типа: индексы списка должны быть целыми числами или срезами, а не str» В строке 37

 import requests import json import urllib, json import time  proxies = {"http": "http://176.9.75.42:3128",  "http": "http://88.198.50.103:8080"}   def jprint(obj):  text = json.dumps(obj, sort_keys=True, indent=4)  print(text)   user_id = input("What is the user ID: ") URL = f"https://badges.roblox.com/v1/users/{user_id}/badges" data = [] payload = {"limit": 100, "sortOrder": "Asc"} resp = requests.get(URL, params=payload) resp.json() blob = resp.json() data.extend(blob["data"]) cursor = blob["nextPageCursor"]  while cursor is not None:  if cursor is None:  break  print("Getting ids")  time.sleep(0)  payload.update({"cursor": cursor})  resp = requests.get(URL, params=payload, proxies=proxies)  blob = resp.json()  data.extend(blob["data"])  cursor = blob["nextPageCursor"]  data.append([cursor])  id_list = [each['id'] for each in data] print(id_list)   

Комментарии:

1. Сделали ли вы основной шаг, распечатав полученные значения, чтобы понять, в чем вы ошибаетесь? Ты даже не сказал нам, в какой строке появляется ошибка. data это странная смесь blob['data'] и. [blob['nextPageCursor']] Вы уверены, что это то, что вы имели в виду?

2. @TimRoberts В строке 37 я получаю эту ошибку, я считаю, что все остальное в порядке и то, что я намеревался

3. Распечатайте свой список данных, прежде чем пытаться извлечь список идентификаторов. Вы обнаружите, что ваш список данных содержит не только диктанты. Где-то там у вас есть список вместо диктанта. Вот почему вы видите ошибку, о которой упомянули. Каждый ваш [«идентификатор»] ожидает, что каждый из них будет диктоваться. Но одно из ваших » e » является списком и, следовательно, вызывает ошибку. Вероятно, это либо проблема добавления/расширения. Может быть, в «data.append([курсор])» не должно быть курсора в квадратных скобках? Это догадка, не заглядывая глубже в ваш код.

Ответ №1:

Я запустил ваш код и изучил его более глубоко.

Ваши проблемы в том, что линия:

 cursor = blob["nextPageCursor"]  

устанавливает курсор на строку. Затем вы добавляете это в список данных в виде списка. Но позже вы ожидаете, что каждый элемент данных будет диктоваться, потому что вы вызываете:

 id_list = [each['id'] for each in data]  

Но запись в списке данных, добавленная вами для курсора, является списком, а не диктом, и не имеет ключа «идентификатор». Вы могли бы достаточно легко заглушить его, чтобы запустить, изменив:

 data.append([cursor])  

к чему-то вроде:

 data.append({'cursor': cursor, 'id': 0})  

или вы могли бы измениться:

 id_list = [each['id'] for each in data]  

Для:

 id_list = [each.get('id') for each in data if isinstance(each, dict)]  

Или вы можете переработать свою логику вокруг захвата/хранения курсора, чтобы создать более надежное решение.