У Python3 я створив програму для читання API (з Палати депутатів Бразилії) та отримання даних у форматі JSON:
import requests
url = "https://dadosabertos.camara.leg.br/api/v2/deputados"
# first create a dictionary with the names and links of each deputy
deputados = {}
for pagina in [1, 2, 3, 4, 5, 6]:
parametros = {"formato": "json", "itens": 100, "pagina": pagina}
resposta = requests.get(url, parametros)
for deputado in resposta.json()["dados"]:
deputados[deputado["nome"]] = deputado["uri"]
# then read each link and create a dictionary with the data of each deputy
perfis = {}
for chave, valor in deputados.items():
print(valor)
print(chave)
resposta = requests.get(valor)
for linha in resposta.json()["dados"]:
perfis[chave] = linha["uri"]
perfis[chave]= linha["nomeCivil"]
for linha2 in resposta.json()["ultimoStatus"]:
perfis[chave] = linha2["nomeEleitoral"]
perfis[chave] = linha2["siglaPartido"]
perfis[chave] = linha2["siglaUf"]
perfis[chave]= linha2["urlFoto"]
for linha3 in resposta.json()["ultimoStatus/gabinete"]:
perfis[chave] = linha3["telefone"]
perfis[chave] = linha3["email"]
perfis[chave] = linha3["sexo"]
perfis[chave] = linha3["dataNascimento"]
Але у мене було таке повідомлення про помилку:
https://dadosabertos.camara.leg.br/api/v2/deputados/178957
ABEL MESQUITA JR.
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-49-067597090c77> in <module>()
5 resposta = requests.get(valor)
6 for linha in resposta.json()["dados"]:
----> 7 perfis[chave] = linha["uri"]
8 perfis[chave]= linha["nomeCivil"]
9 for linha2 in resposta.json()["ultimoStatus"]:
TypeError: string indices must be integers
Ось приклад даних сторінки:
resposta = requests.get("https://dadosabertos.camara.leg.br/api/v2/deputados/178957")
print(resposta.json())
{"dados": {"id": 178957, "uri": "https://dadosabertos.camara.leg.br/api/v2/deputados/178957", "nomeCivil": "ABEL SALVADOR MESQUITA JUNIOR", "ultimoStatus": {"id": 178957, "uri": "https://dadosabertos.camara.leg.br/api/v2/deputados/178957", "nome": "ABEL MESQUITA JR.", "siglaPartido": "DEM", "uriPartido": "https://dadosabertos.camara.leg.br/api/v2/partidos/36769", "siglaUf": "RR", "idLegislatura": 55, "urlFoto": "http://www.camara.leg.br/internet/deputado/bandep/178957.jpg", "data": "2015-02-01", "nomeEleitoral": "ABEL MESQUITA JR.", "gabinete": {"nome": "248", "predio": "4", "sala": "248", "andar": "2", "telefone": "3215-5248", "email": "dep.abelmesquitajr.@camara.leg.br"}, "situacao": "Exercício", "condicaoEleitoral": "Titular", "descricaoStatus": None}, "cpf": "", "sexo": "M", "urlWebsite": None, "redeSocial": [], "dataNascimento": "1962-03-29", "dataFalecimento": None, "ufNascimento": "RR", "municipioNascimento": "Boa Vista", "escolaridade": "Superior Incompleto"}, "links": [{"rel": "self", "href": "https://dadosabertos.camara.leg.br/api/v2/deputados/178957"}]}
Будь ласка, хтось знає, чому сталася помилка під час створення другого словника та початку його подачі?
Відповіді:
1 для відповіді № 1Коли ви переглядаєте словник (resposta.json()["dados"]
), ітерація за замовчуванням у ключі словника. Тому linha
буде id
або uri
і т. д. Ось чому ви отримуєте string indices must be integers
. Мені важко зрозуміти, що ви намагаєтесь зробити, оскільки це не англійською мовою, а якщо ви просто хочете витягти інформацію з json
словнику, можливо, ви захочете зробити це:
json_res = reposta.json()
perfis.update(json_res["dados"])
perfis.update(json_res["ultimoStatus"])
1 для відповіді № 2
Проблема полягає в тому, на що вказував Амір Рахум:
З for
цикли, ви отримуєте доступ до кожного ключа вашого словника (який є рядком) і трингуєте, щоб індексувати цей рядок іншим рядком: в основному ви дзвоните "id"["uri"]
.
Ви можете уникнути for
цикл і отримати доступ до вашої змінної безпосередньо; щось подібне повинно працювати:
perfis = {}
for chave, valor in deputados.items():
print(valor)
print(chave)
resposta = requests.get(valor)
answer = resposta.json()
perfis.setdefault(chave, {})["uri"] = answer["dados"]["uri"]
perfis.setdefault(chave, {})["nomeCivil"] = answer["dados"]["nomeCivil"]
perfis.setdefault(chave, {})["nomeEleitoral"] = answer["dadultimoStatusos"]["nomeEleitoral"]
perfis.setdefault(chave, {})["siglaPartido"] = answer["dadultimoStatusos"]["siglaPartido"]
perfis.setdefault(chave, {})["siglaUf"] = answer["dadultimoStatusos"]["siglaUf"]
perfis.setdefault(chave, {})["urlFoto"] = answer["dadultimoStatusos"]["urlFoto"]
perfis.setdefault(chave, {})["telefone"] = answer["ultimoStatus/gabinete"]["telefone"]
perfis.setdefault(chave, {})["email"] = answer["ultimoStatus/gabinete"]["email"]
perfis.setdefault(chave, {})["sexo"] = answer["ultimoStatus/gabinete"]["sexo"]
perfis.setdefault(chave, {})["dataNascimento"] = answer["ultimoStatus/gabinete"]["dataNascimento"]