2017-12-19 4 views
2

では、私は(議員のブラジル商工会議所からの)APIを読んで、私は辞書のリストを作っJSONでAPIを正しく読み込んでリストを作成するにはどうすればいいですか? python3でPythonの

import requests 
import pandas as pd 

url = 'https://dadosabertos.camara.leg.br/api/v2/deputados' 

まずJSONでデータを取得するためのプログラムを作った - 彼らは議員の名前があり、それぞれのAPIリンク。私は、データフレームを作成

deputados 
[{'deputado': 'ABEL MESQUITA JR.', 
    'link_api': 'https://dadosabertos.camara.leg.br/api/v2/deputados/178957'}, 
{'deputado': 'ADAIL CARNEIRO', 
    'link_api': 'https://dadosabertos.camara.leg.br/api/v2/deputados/178864'}, 
{'deputado': 'ADALBERTO CAVALCANTI', 
    'link_api': 'https://dadosabertos.camara.leg.br/api/v2/deputados/178914'}, 
{'deputado': 'ADELMO CARNEIRO LEÃO', 
    'link_api': 'https://dadosabertos.camara.leg.br/api/v2/deputados/178890'}, 
{'deputado': 'ADELSON BARRETO', 
    'link_api': 'https://dadosabertos.camara.leg.br/api/v2/deputados/178968'}, 
{'deputado': 'ADEMIR CAMILO', 
    'link_api': 'https://dadosabertos.camara.leg.br/api/v2/deputados/133374'}, 
... 

:パラメータは、リストの内容JSON、ページあたりの項目数とページ数(500人の以上の議員があり、その後、6ページがある)

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']: 
     dicionario = {"deputado": deputado['nome'], "link_api": deputado['uri']} 
     deputados.append(dicionario) 

ました結果は

df = pd.DataFrame(deputados) 
df.reset_index().head() 
index deputado link_api 
0 0 ABEL MESQUITA JR. https://dadosabertos.camara.leg.br/api/v2/depu... 
1 1 ADAIL CARNEIRO https://dadosabertos.camara.leg.br/api/v2/depu... 
2 2 ADALBERTO CAVALCANTI https://dadosabertos.camara.leg.br/api/v2/depu... 
3 3 ADELMO CARNEIRO LEÃO https://dadosabertos.camara.leg.br/api/v2/depu... 
4 4 ADELSON BARRETO  https://dadosabertos.camara.leg.br/api/v2/depu... 

です。その後、辞書を使って別のリストを作成しました。今回は、すべての副APIページに行き、いくつかのデータを抽出したいと考えています。私は結果を確認するためにいくつかのプリント( "レスポスタ"と "リナ")を入れました。パラメータは、今私は(文字列のインデックスは整数でなければなりません)エラーが発生しました。ここ

perfis = [] 
for num, row in df.iterrows(): 
    parametros = {'formato': 'json'} 
    resposta = requests.get(row['link_api'], parametros) 
    print(resposta) 
    for linha in resposta.json()['dados']: 
     print(linha) 
     item1 = linha['uri'] 
     item2 = linha['nomeCivil'] 
    for linha2 in resposta.json()['ultimoStatus']: 
     item3 = linha2['nomeEleitoral'] 
     item4 = linha2['siglaPartido'] 
     item5 = linha2['siglaUf'] 
     item6 = linha2['urlFoto'] 
    for linha3 in resposta.json()['ultimoStatus/gabinete']: 
     item7 = linha3['telefone'] 
     item8 = linha3['email'] 
     item9 = linha3['sexo'] 
     item10 = linha3['dataNascimento'] 
    dicionario = {"link_api": item1, "nome_completo": item2, "nome_eleitoral": item3, "partido": item4, "uf": item5, "link_foto": item6, "telefone": item7, "e_mail": item8, "sexo": item9, "data_nascimento": item2}  
    perfis.append(dicionario) 

ちょうどJSONで、プリントが

<Response [200]> 
id 

--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 
<ipython-input-21-bfada3632dc2> in <module>() 
     6  for linha in resposta.json()['dados']: 
     7   print(linha) 
----> 8   item1 = linha['uri'] 
     9   item2 = linha['nomeCivil'] 
    10  for linha2 in resposta.json()['ultimoStatus']: 

TypeError: string indices must be integers 

ちょうど、「resposta」を確認副APIが正しく読まれなかったことを示しましたprint = Response [200]と "linha" = idです。 「resposta」の場合、APIリンクのrequests.get値が必要です。 「linhaは」選ばれた項目

のJSON値であり、それから私は個別APIのリンクをテストし、それが働いた:

resposta = requests.get('https://dadosabertos.camara.leg.br/api/v2/deputados/178890') 
print(resposta.json()) 
{'dados': {'id': 178890, 'uri': 'https://dadosabertos.camara.leg.br/api/v2/deputados/178890', 'nomeCivil': 'ADELMO CARNEIRO LEAO', 'ultimoStatus': {'id': 178890, 'uri': 'https://dadosabertos.camara.leg.br/api/v2/deputados/178890', 'nome': 'ADELMO CARNEIRO LEÃO', 'siglaPartido': 'PT', 'uriPartido': 'https://dadosabertos.camara.leg.br/api/v2/partidos/36844', 'siglaUf': 'MG', 'idLegislatura': 55, 'urlFoto': 'http://www.camara.leg.br/internet/deputado/bandep/178890.jpg', 'data': '2015-03-06', 'nomeEleitoral': 'ADELMO CARNEIRO LEÃO', 'gabinete': {'nome': '231', 'predio': '4', 'sala': '231', 'andar': '2', 'telefone': '3215-5231', 'email': '[email protected]'}, 'situacao': 'Exercício', 'condicaoEleitoral': 'Suplente', 'descricaoStatus': None}, 'cpf': '', 'sexo': 'M', 'urlWebsite': None, 'redeSocial': [], 'dataNascimento': '1949-05-25', 'dataFalecimento': None, 'ufNascimento': 'MG', 'municipioNascimento': 'Itapagipe', 'escolaridade': 'Doutorado'}, 'links': [{'rel': 'self', 'href': 'https://dadosabertos.camara.leg.br/api/v2/deputados/178890'}]} 

をJSONページはここで見ることができます:https://dadosabertos.camara.leg.br/api/v2/deputados/178890?formato=json

をしてくださいすることができますこれは、2番目のリストを作成しようとすると、いくつかのパラメータが欠落していることを意味します。このため、ラインの

+1

'resposta.json()['dados']'は明らかに辞書なので、 'for..in'ループで繰り返し処理すると、本質的にキーではなく値が得られます。最後に '.values()'を追加して値を繰り返し処理します。 – zwer

+0

APIリンクのすべてが 'uri'を提供するわけではないのでしょうか? –

+0

こんにちは、ありがとう。私はresposta.json()['data']にlinhaを入れました。 values(): –

答えて

1

for linha in resposta.json()['dados']: 

ここでは、あなたがresposta.json()['dados']に持っているものの一例である:

{'ufNascimento': 'MG', 'municipioNascimento': 'Teófilo Otoni', 'redeSocial': [], 'id': 133374, 'dataNascimento': '1964-05-30', 'dataFalecimento': None, 'urlWebsite': None, 'ultimoStatus': {'siglaPartido': 'PODE', 'condicaoEleitoral': 'Suplente', 'idLegislatura': 55, 'nome': 'ADEMIR CAMILO', 'id': 133374, 'nomeEleitoral': 'ADEMIR CAMILO', 'descricaoStatus': None, 'uri': 'https://dadosabertos.camara.leg.br/api/v2/deputados/133374', 'uriPartido': 'https://dadosabertos.camara.leg.br/api/v2/partidos/36896', 'situacao': 'Exercício', 'urlFoto': 'http://www.camara.leg.br/internet/deputado/bandep/133374.jpg', 'gabinete': {'predio': '4', 'nome': '556', 'andar': '5', 'sala': '556', 'telefone': '3215-5556', 'email': '[email protected]'}, 'siglaUf': 'MG', 'data': '2016-04-19'}, 'nomeCivil': 'ADEMIR CAMILO PRATES RODRIGUES', 'cpf': '', 'escolaridade': None, 'sexo': 'M', 'uri': 'https://dadosabertos.camara.leg.br/api/v2/deputados/133374'} 

それは辞書です。 dictionaryさんキー

for x in dictonaryループ、あなたがリストにループしているよう:

だから、
['urlWebsite', 'sexo', 'nomeCivil', 'cpf', 'ultimoStatus', 'dataFalecimento', 'municipioNascimento', 'uri', 'id', 'escolaridade', 'dataNascimento', 'redeSocial', 'ufNascimento'] 

、それは明らかに何かを意味しないitem1 = ['foo', 'bar']['baz']を書くようなものだitem1 = linha['uri']を書きます。

クイックフィックス:for linha in resposta.json()['dados']:linha = resposta.json()['dados']に置き換え、次のコードを入力しないでください。それはうまくいくでしょう

+0

ありがとうございました。コマンド(linha = resposta.json()['dados'])は正常に動作しました。しかし、私が 'dados'内で辞書を取得しようとすると、動作しません(linha2 = resposta.json()['dados/ultimoStatus'])。 KeyError:KeyError: 'dados/ultimoStatus' –

+0

別の辞書内の1つの辞書にアクセスするには、別の辞書にアクセスする必要がありますか? –

+1

'foo'>' bar'にアクセスするために 'a_dict ['foo/bar']'を実行することはできません。あなたが望むのは 'linha2 = resposta.json()['dados'] ['ultimoStatus']' – Arount

関連する問題