如何正确读取具有几个子级别的JSON?

时间:2019-01-17 16:49:00

标签: python json pandas python-requests

在Python3中,此代码从巴西参议院读取API,以创建一个数据框架和一年的提议

import requests
import pandas as pd

headers = {"Accept" : "application/json"}

proposals = []
url = 'http://legis.senado.leg.br/dadosabertos/materia/pesquisa/lista?ano=2010'

try:
    r = requests.get(url, headers=headers)
except requests.exceptions.HTTPError as errh:
    print ("Http Error:",errh)
except requests.exceptions.ConnectionError as errc:
    print ("Error Connecting:",errc) 
except requests.exceptions.Timeout as errt:
    print ("Timeout Error:",errt)  
except requests.exceptions.RequestException as err:
    print ("OOps: Something Else",err)

content = r.json()

for item in content["PesquisaBasicaMateria"]["Materias"]["Materia"]:
    dicionario = {"AnoMateria": str(item['IdentificacaoMateria']['AnoMateria']), 
                      "CodigoMateria": str(item['IdentificacaoMateria']['CodigoMateria']), 
                      "DescricaoIdentificacaoMateria": item['IdentificacaoMateria']['DescricaoIdentificacaoMateria'], 
                      "DescricaoObjetivoProcesso": item["DescricaoObjetivoProcesso"] if "DescricaoObjetivoProcesso" in item else None,
                      "DescricaoSubtipoMateria": item['IdentificacaoMateria']['DescricaoSubtipoMateria'], 
                      "IndicadorTramitando": item['IdentificacaoMateria']['IndicadorTramitando'], 
                      "NomeCasaIdentificacaoMateria": item['IdentificacaoMateria']['NomeCasaIdentificacaoMateria'], 
                      "NumeroMateria": str(item['IdentificacaoMateria']['NumeroMateria']), 
                      "ApelidoMateria": item['DadosBasicosMateria']['ApelidoMateria'] if 'ApelidoMateria' in item else None, 
                      "DataApresentacao": item['DadosBasicosMateria']['DataApresentacao'], 
                      "DataLeitura": item['DadosBasicosMateria']['DataLeitura'] if 'DataLeitura' in item else None,
                      "EmentaMateria": item['DadosBasicosMateria']['EmentaMateria'] if 'EmentaMateria' in item else None,
                      "ExplicacaoEmentaMateria": item['DadosBasicosMateria']['ExplicacaoEmentaMateria'] if 'ExplicacaoEmentaMateria' in item else None,
                      "IndicadorComplementar": item['DadosBasicosMateria']['IndicadorComplementar'] if 'IndicadorComplementar' in item else None,
                      "NaturezaMateria": item['DadosBasicosMateria']['NaturezaMateria'] if 'NaturezaMateria' in item else None,
                      "NomeAutor": item['AutoresPrincipais']['AutorPrincipal']['NomeAutor'] if 'NomeAutor' in item else None,
                      "SiglaTipoAutor": item['AutoresPrincipais']['AutorPrincipal']['SiglaTipoAutor'] if 'SiglaTipoAutor' in item else None,
                      "IndicadorOutrosAutores": item['AutoresPrincipais']['AutorPrincipal']['IndicadorOutrosAutores'] if 'IndicadorOutrosAutores' in item else None,
                      "CodigoParlamentar": str(item['AutoresPrincipais']['AutorPrincipal']['IdentificacaoParlamentar']['CodigoParlamentar']) if 'CodigoParlamentar' in item else None,
                      "NomeParlamentar": item['AutoresPrincipais']['AutorPrincipal']['IdentificacaoParlamentar']['NomeParlamentar'] if 'NomeParlamentar' in item else None,
                      "NomeCompletoParlamentar": item['AutoresPrincipais']['AutorPrincipal']['IdentificacaoParlamentar']['NomeCompletoParlamentar'] if 'NomeCompletoParlamentar' in item else None,
                      "UrlFotoParlamentar": item['AutoresPrincipais']['AutorPrincipal']['IdentificacaoParlamentar']['UrlFotoParlamentar'] if 'UrlFotoParlamentar' in item else None,
                      "UfParlamentar": item['AutoresPrincipais']['AutorPrincipal']['IdentificacaoParlamentar']['UfParlamentar'] if 'UfParlamentar' in item else None,
                      "DataSituacao": item['SituacaoAtual']['Autuacoes']['Autuacao']['Situacao']['DataSituacao'] if 'DataSituacao' in item else None,
                      "DescricaoSituacao": item['SituacaoAtual']['Autuacoes']['Autuacao']['Situacao']['DescricaoSituacao'] if 'DescricaoSituacao' in item else None
                      }
    proposals.append(dicionario)

df_projetos_api = pd.DataFrame(proposals)
df_projetos_api.info()

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 4216 entries, 0 to 4215
Data columns (total 25 columns):
AnoMateria                       4216 non-null object
ApelidoMateria                   0 non-null object
CodigoMateria                    4216 non-null object
CodigoParlamentar                0 non-null object
DataApresentacao                 4216 non-null object
DataLeitura                      0 non-null object
DataSituacao                     0 non-null object
DescricaoIdentificacaoMateria    4216 non-null object
DescricaoObjetivoProcesso        0 non-null object
DescricaoSituacao                0 non-null object
DescricaoSubtipoMateria          4216 non-null object
EmentaMateria                    0 non-null object
ExplicacaoEmentaMateria          0 non-null object
IndicadorComplementar            0 non-null object
IndicadorOutrosAutores           0 non-null object
IndicadorTramitando              4216 non-null object
NaturezaMateria                  0 non-null object
NomeAutor                        0 non-null object
NomeCasaIdentificacaoMateria     4216 non-null object
NomeCompletoParlamentar          0 non-null object
NomeParlamentar                  0 non-null object
NumeroMateria                    4216 non-null object
SiglaTipoAutor                   0 non-null object
UfParlamentar                    0 non-null object
UrlFotoParlamentar               0 non-null object
dtypes: object(25)
memory usage: 411.8+ KB

这是JSON的摘录:

{'PesquisaBasicaMateria': {'@xmlns:xsi': 'http://www.w3.org/2001/XMLSchema-instance',
  '@xsi:noNamespaceSchemaLocation': 'http://legis.senado.gov.br/dadosabertos/dados/PesquisaBasicaMateriav5.xsd',
  'Metadados': {'Versao': '16/01/2019 18:31:16',
   'VersaoServico': '5',
   'DataVersaoServico': '2017-02-01',
   'DescricaoDataSet': 'Efetua a pesquisa de matérias, com a criação de um filtro através dos parâmetros que podem ser informados.\n      Se não informar parâmetro algum, não retorna conteúdo.'},
  'Materias': {'Materia': [{'IdentificacaoMateria': {'CodigoMateria': '114035',
      'SiglaCasaIdentificacaoMateria': 'SF',
      'NomeCasaIdentificacaoMateria': 'Senado Federal',
      'SiglaSubtipoMateria': 'ATS',
      'DescricaoSubtipoMateria': 'ATO DO PRESIDENTE DO SENADO FEDERAL',
      'NumeroMateria': '00192',
      'AnoMateria': '2010',
      'DescricaoIdentificacaoMateria': 'ATS 192/2010',
      'IndicadorTramitando': 'Não'},
     'DadosBasicosMateria': {'EmentaMateria': 'Institui Comissão de Juristas responsável pela elaboração de anteprojeto de Código Eleitoral.',
      'IndicadorComplementar': 'Não',
      'DataApresentacao': '2010-06-08',
      'SiglaCasaLeitura': 'SF',
      'NomeCasaLeitura': 'Senado Federal'},
     'AutoresPrincipais': {'AutorPrincipal': {'SiglaTipoAutor': 'PRESIDENTE_SF',
       'IndicadorOutrosAutores': 'Não'}},
     'SituacaoAtual': {'Autuacoes': {'Autuacao': {'NumeroAutuacao': '1',
        'Situacao': {'DataSituacao': '2018-12-21',
         'CodigoSituacao': '32',
         'SiglaSituacao': 'COMEXT',
         'DescricaoSituacao': 'COMISSÃO TEMPORÁRIA EXTINTA'},
        'Local': {'DataLocal': '2018-12-21',
         'CodigoLocal': '1998',
         'SiglaCasaLocal': 'SF',
         'NomeCasaLocal': 'Senado Federal',
         'SiglaLocal': 'PLEN',
         'NomeLocal': 'Plenário do Senado Federal'}}}}},
    {'IdentificacaoMateria': {'CodigoMateria': '98952',
      'SiglaCasaIdentificacaoMateria': 'CN',
      'NomeCasaIdentificacaoMateria': 'Congresso Nacional',
      'SiglaSubtipoMateria': 'AVN',
      'DescricaoSubtipoMateria': 'AVISO (CN)',
      'NumeroMateria': '00001',
      'AnoMateria': '2011',
      'DescricaoIdentificacaoMateria': 'AVN 1/2011',
      'IndicadorTramitando': 'Não'},
     'DadosBasicosMateria': {'EmentaMateria': 'Encaminha ao Congresso Nacional o Relatório de Desempenho do Fundo Soberano do Brasil - FSB, relativo ao terceiro trimestre de 2010.',
      'IndicadorComplementar': 'Não',
      'DataApresentacao': '2011-01-26',
      'DataLeitura': '2011-01-26',
      'SiglaCasaLeitura': 'CN',
      'NomeCasaLeitura': 'Congresso Nacional',
      'NaturezaMateria': {'CodigoNatureza': '1062',
       'NomeNatureza': 'RELATORIO_DESEMPENHO_FSB',
       'DescricaoNatureza': 'Relatório de Desempenho do Fundo Soberano do Brasil'}},
     'AutoresPrincipais': {'AutorPrincipal': {'NomeAutor': 'Ministério da Fazenda',
       'SiglaTipoAutor': 'COMISSAO_CONGRESSO',
       'IndicadorOutrosAutores': 'Não'}},
     'SituacaoAtual': {'Autuacoes': {'Autuacao': {'NumeroAutuacao': '1',
        'Situacao': {'DataSituacao': '2013-11-29',
         'CodigoSituacao': '107',
         'SiglaSituacao': 'CONHECIDA',
         'DescricaoSituacao': 'CONHECIDA.'},
        'Local': {'DataLocal': '2013-12-19',
         'CodigoLocal': '354',
         'SiglaCasaLocal': 'SF',
         'NomeCasaLocal': 'Senado Federal',
         'SiglaLocal': 'SARQ',
         'NomeLocal': 'Secretaria de Arquivo'}}}}},
    {'IdentificacaoMateria': {'CodigoMateria': '95410',
      'SiglaCasaIdentificacaoMateria': 'CN',
      'NomeCasaIdentificacaoMateria': 'Congresso Nacional',
      'SiglaSubtipoMateria': 'AVN',
      'DescricaoSubtipoMateria': 'AVISO (CN)',
      'NumeroMateria': '00001',
      'AnoMateria': '2010',
      'DescricaoIdentificacaoMateria': 'AVN 1/2010',
      'IndicadorTramitando': 'Não'},
     'DadosBasicosMateria': {'EmentaMateria': 'Encaminha ao Congresso Nacional o Relatório de Desempenho do Fundo Soberano do Brasil, relativo ao terceiro trimestre de 2009.',
      'IndicadorComplementar': 'Não',
      'DataApresentacao': '2010-02-01',
      'DataLeitura': '2010-02-01',
      'SiglaCasaLeitura': 'CN',
      'NomeCasaLeitura': 'Congresso Nacional',
      'NaturezaMateria': {'CodigoNatureza': '1062',
       'NomeNatureza': 'RELATORIO_DESEMPENHO_FSB',
       'DescricaoNatureza': 'Relatório de Desempenho do Fundo Soberano do Brasil'}},
     'AutoresPrincipais': {'AutorPrincipal': {'NomeAutor': 'Ministério da Fazenda',
       'SiglaTipoAutor': 'COMISSAO_CONGRESSO',
       'IndicadorOutrosAutores': 'Não'}},
     'SituacaoAtual': {'Autuacoes': {'Autuacao': {'NumeroAutuacao': '1',
        'Situacao': {'DataSituacao': '2013-11-29',
         'CodigoSituacao': '107',
         'SiglaSituacao': 'CONHECIDA',
         'DescricaoSituacao': 'CONHECIDA.'},
        'Local': {'DataLocal': '2013-12-19',
         'CodigoLocal': '354',
         'SiglaCasaLocal': 'SF',
         'NomeCasaLocal': 'Senado Federal',
         'SiglaLocal': 'SARQ',
         'NomeLocal': 'Secretaria de Arquivo'}}}}},
    {'IdentificacaoMateria': {'CodigoMateria': '95411',
      'SiglaCasaIdentificacaoMateria': 'CN',
      'NomeCasaIdentificacaoMateria': 'Congresso Nacional',
      'SiglaSubtipoMateria': 'AVN',
      'DescricaoSubtipoMateria': 'AVISO (CN)',
      'NumeroMateria': '00002',
      'AnoMateria': '2010',
      'DescricaoIdentificacaoMateria': 'AVN 2/2010',
      'IndicadorTramitando': 'Não'},
     'DadosBasicosMateria': {'EmentaMateria': 'Encaminha ao Congresso Nacional Relatório sobre as operações de redesconto e empréstimo realizadas nos termos da Lei 11.882, de 23 de dezembro de 2008.',
      'IndicadorComplementar': 'Não',
      'DataApresentacao': '2010-02-01',
      'DataLeitura': '2010-02-01',
      'SiglaCasaLeitura': 'SF',
      'NomeCasaLeitura': 'Senado Federal',
      'NaturezaMateria': {'CodigoNatureza': '285',
       'NomeNatureza': 'RELATORIO_RECOMEND_DOCUMENT',
       'DescricaoNatureza': 'Relatório, recomendação, documentação'},
      'ResultadoMateria': 'Situação: Incluída em pauta, no âmbito da CMO.'},
     'AutoresPrincipais': {'AutorPrincipal': {'NomeAutor': 'Banco Central do Brasil',
       'SiglaTipoAutor': 'COMISSAO_CONGRESSO',
       'IndicadorOutrosAutores': 'Não'}},
     'SituacaoAtual': {'Autuacoes': {'Autuacao': {'NumeroAutuacao': '1',
        'Situacao': {'DataSituacao': '2015-08-04',
         'CodigoSituacao': '107',
         'SiglaSituacao': 'CONHECIDA',
         'DescricaoSituacao': 'CONHECIDA.'},
        'Local': {'DataLocal': '2015-08-12',
         'CodigoLocal': '354',
         'SiglaCasaLocal': 'SF',
         'NomeCasaLocal': 'Senado Federal',
         'SiglaLocal': 'SARQ',
         'NomeLocal': 'Secretaria de Arquivo'}}}}},

...

信息在以下键之后开始:[“ PesquisaBasicaMateria”] [“ Materias”] [“ Materia”]

然后开始一组四个键-“ IdentificacaoMateria”,“ DadosBasicosMateria”,“ AutoresPrincipais”和“ SituacaoAtual”,这些键是我要包含在数据框中的列的信息,并且某些信息在其中内部子级别

“ IdentificacaoMateria”,“ DadosBasicosMateria”,“ AutoresPrincipais”和“ SituacaoAtual”的每个集合都是一个命题。而且某些项目不是必需的,它们只是不会显示-所以我用None进行了测试

代码可以正常工作并生成数据框,但是某些列是完全空白的,例如ApelidoMateria,NomeAutor或NomeParlamentar。我正在检查信息的关键路径并看起来正确

请,有人知道问题出在哪里吗?还是有更好的方法呢?

0 个答案:

没有答案