Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用JSON正确读取API并创建列表?用Python_Python_Json_Api - Fatal编程技术网

如何使用JSON正确读取API并创建列表?用Python

如何使用JSON正确读取API并创建列表?用Python,python,json,api,Python,Json,Api,在Python3中,我制作了一个程序来读取API(来自巴西众议院)并以JSON格式获取数据 import requests import pandas as pd url = 'https://dadosabertos.camara.leg.br/api/v2/deputados' 首先,我用字典列出了一个列表——它们是代表的名字和每个人各自的API链接。参数是json、每页的项目数和页码(有500多个副手,然后是6页) 名单内容: deputados [{'deputado': 'ABEL

在Python3中,我制作了一个程序来读取API(来自巴西众议院)并以JSON格式获取数据

import requests
import pandas as pd

url = 'https://dadosabertos.camara.leg.br/api/v2/deputados'
首先,我用字典列出了一个列表——它们是代表的名字和每个人各自的API链接。参数是json、每页的项目数和页码(有500多个副手,然后是6页)

名单内容:

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'},
...
我用结果创建了一个数据帧

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页面上提取一些数据。我用一些指纹检查结果(“resposta”和“linha”)。参数现在只是json

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)
这里我有一个错误(字符串索引必须是整数),打印结果显示代理API没有正确读取

<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
​这里可以看到JSON页面:

这是否意味着在我尝试创建第二个列表时缺少某些参数?

因为这行:

for linha in resposta.json()['dados']:
下面是您在
resposta.json()

{'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': 'dep.ademircamilo@camara.leg.br'}, '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'}
这是一本字典

对于口述中的x
字典
键中循环,因此您在列表上循环:

['urlWebsite', 'sexo', 'nomeCivil', 'cpf', 'ultimoStatus', 'dataFalecimento', 'municipioNascimento', 'uri', 'id', 'escolaridade', 'dataNascimento', 'redeSocial', 'ufNascimento']
所以,写
item1=linha['uri']
就像写
item1=['foo','bar']['baz']
这显然没有任何意义


快速修复:用
linha=resposta.json()。它将起作用

resposta.json()['dados']
显然是一个字典,因此当您使用
for..在
循环中对它进行迭代时,您实际上得到的是它的键,而不是它的值。在末尾添加
.values()
以迭代这些值。可能并非所有api链接都提供
uri
?您好,谢谢。我在resposta.json()['data']中为linha添加了->命令。值():但“resposta”打印继续响应[200]。“linha”的指纹显示的是178957,这是身份证的价值,非常感谢。命令(linha=resposta.json()['dados'])运行良好。但是当我试图将字典放入“dados”中时,它不起作用(linha2=resposta.json()['dados/ultimoStatus'])。它有以下错误:KeyError:KeyError:“dados/ultimoStatus”为了在另一个字典中访问一个字典,命令应该是另一个吗?您不能执行
a_dict['foo/bar']
来访问key
foo
bar
。您需要的是
linha2=resposta.json()['dados']['ultimoStatus']
{'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': 'dep.ademircamilo@camara.leg.br'}, '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'}
['urlWebsite', 'sexo', 'nomeCivil', 'cpf', 'ultimoStatus', 'dataFalecimento', 'municipioNascimento', 'uri', 'id', 'escolaridade', 'dataNascimento', 'redeSocial', 'ufNascimento']