简体   繁体   English

在python中,如何解析多层JSON?

[英]In python, how to parse a multi-layered JSON?

Please, in Python 3 I have a script to access an API using requests, which I then turn into JSON拜托,在 Python 3 中,我有一个使用请求访问 API 的脚本,然后我将其转换为 JSON

However, some information is at deep sublevels and I can't seem to access it.但是,有些信息处于深层子级别,我似乎无法访问它。 See below:见下文:

import requests

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

url = "http://legis.senado.leg.br/dadosabertos/materia/20050"

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)

projects = r.json()

try:
    NomeAutor= str(projects['DetalheMateria']['Materia']['Autoria']['Autor']['NomeAutor'])
    print("ok")
except KeyError:
    NomeAutor = None                
    print("keyerror")
except TypeError:
    NomeAutor = None                     
    print("typerror")

print(NomeAutor)

When I try to capture the "NomeAutor" the error is typerror当我尝试捕获“NomeAutor”时,错误是 typerror

Here is the content of projects:以下是项目内容:

{'DetalheMateria': {'@xmlns:xsi': 'http://www.w3.org/2001/XMLSchema-instance', '@xsi:noNamespaceSchemaLocation': 'http://legis.senado.leg.br/dadosabertos/dados/DetalheMateriav5.xsd', 'Metadados': {'Versao': '03/12/2019 21:36:18', 'VersaoServico': '5', 'DataVersaoServico': 
'2017-02-01', 'DescricaoDataSet': 'Dados básicos da matéria, incluindo autoria, norma gerada e outras informações. A partir de fevereiro de 2019, os requerimentos de comissões permanentes passam a ser numerados com a mesma sistemática dos requerimentos das comissões temporárias, seguindo, portanto, o padrão: REQ 99/2019 - SIGLA_COMISSÃO. Dessa forma, para se buscar um requerimento de determinada comissão (com ano a partir de 2019), deve-se informar .../materia/sigla/número/ano?comissao=sigla da comissão.'}, 'Materia': {'IdentificacaoMateria': {'CodigoMateria': '20050', 'SiglaCasaIdentificacaoMateria': 'SF', 'NomeCasaIdentificacaoMateria': 'Senado Federal', 'SiglaSubtipoMateria': 'PLC', 'DescricaoSubtipoMateria': 'PROJETO DE LEI DA CÂMARA', 'NumeroMateria': '00035', 'AnoMateria': '1988', 'DescricaoObjetivoProcesso': 'Revisora', 'DescricaoIdentificacaoMateria': 'PLC 35/1988', 'IndicadorTramitando': 
'Não'}, 'DadosBasicosMateria': {'EmentaMateria': "DECLARA FERIADO NACIONAL O DIA 20 DE NOVEMBRO, ANIVERSARIO DA MORTE   \n      DE ZUMBI DOS PALMARES, CONSAGRADO PELA COMUNIDADE AFRO-BRASILEIRA     \n      COMO 'DIA NACIONAL DA CONSCIENCIA NEGRA.'                          
   \n      ", 'IndicadorComplementar': 'Não', 'DataApresentacao': '1987-12-01', 'DataLeitura': '1987-12-01'}, 'Autoria': {'Autor': [{'NomeAutor': 'Câmara dos Deputados', 'SiglaTipoAutor': 'CAMARA', 'DescricaoTipoAutor': 'Câmara dos Deputados', 'NumOrdemAutor': '1', 'IndicadorOutrosAutores': 'Não'}]}, 'Iniciativa': {'SiglaTipoIniciativa': 'DEPUTADO', 'DescricaoTipoIniciativa': 'Deputado', 'DescricaoIniciativa': 'BENEDITA DA SILVA'}, 'OrigemMateria': {'SiglaCasaOrigem': 'CD', 'NomeCasaOrigem': 'Câmara dos Deputados'}, 'CasaIniciadoraNoLegislativo': {'SiglaCasaIniciadora': 'SF', 'NomeCasaIniciadora': 'Senado Federal'}, 'OutrosNumerosDaMateria': {'OutroNumeroDaMateria': {'IdentificacaoMateria': {'SiglaCasaIdentificacaoMateria': 'CD', 'NomeCasaIdentificacaoMateria': 'Câmara dos Deputados', 'SiglaSubtipoMateria': 
'PL', 'DescricaoSubtipoMateria': 'PROJETO DE LEI', 'NumeroMateria': '00293', 'AnoMateria': 
'1987'}, 'DescricaoTipoNumeracao': 'CasaIniciadora'}}, 'SituacaoAtual': {'Autuacoes': {'Autuacao': [{'NumeroAutuacao': '1', 'Situacao': {'DataSituacao': '1996-01-23', 'CodigoSituacao': '28', 'SiglaSituacao': 'ARQVD', 'DescricaoSituacao': 'ARQUIVADA AO FINAL DA LEGISLATURA'}, 'Local': {'DataLocal': '1996-01-23', 'CodigoLocal': '206', 'TipoLocal': 'A', 'SiglaCasaLocal': 'SF', 'NomeCasaLocal': 'Senado Federal', 'SiglaLocal': 'SSEXP', 'NomeLocal': 'SUBSECRETARIA DE EXPEDIENTE'}}]}}, 'OutrasInformacoes': {'Servico': [{'NomeServico': 'EmendaMateria', 'DescricaoServico': 'Emendas da matéria', 'UrlServico': 'http://legis.senado.leg.br/dadosabertos/materia/emendas/20050?v=6'}, {'NomeServico': 'MovimentacaoMateria', 'DescricaoServico': 'Movimentações da matéria, como tramitações, despachos e prazos.\n      Evoluções:\n      14/8/2019\n      - criada nova Tag "DeliberacoesMPV" para as deliberações de MPV;\n 
     - criada nova Tag "DescricaoItemCalendario" subord', 'UrlServico': 'http://legis.senado.leg.br/dadosabertos/materia/movimentacoes/20050?v=6'}, {'NomeServico': 'RelatoriaMateria', 'DescricaoServico': 'Relatoria atual e relatorias encerradas (histórico) da matéria', 'UrlServico': 'http://legis.senado.leg.br/dadosabertos/materia/relatorias/20050?v=5'}, {'NomeServico': 'TextoMateria', 'DescricaoServico': 'Textos da matéria. \n      Evoluções da versão: \n      28/8/2019 - incluída a tag "AutoriaTexto", sob a tag "Texto".', 'UrlServico': 'http://legis.senado.leg.br/dadosabertos/materia/textos/20050?v=5'}, {'NomeServico': 'VotacaoMateria', 'DescricaoServico': 'Votações da matéria', 'UrlServico': 'http://legis.senado.leg.br/dadosabertos/materia/votacoes/20050?v=5'}, {'NomeServico': 'VotacoesComissao', 'UrlServico': 'http://legis.senado.leg.br/dadosabertos/votacaoComissao/materia/PLC/00035/1988?v=1'}]}, 'UrlGlossario': 'http://legis.senado.leg.br/dadosabertos/glossario/lista'}}} 

Please does anyone know why the information is not captured?请问有谁知道为什么信息没有被捕获?

And is there any simpler way to capture information on a deep JSON sublevel without having to type it all the way?有没有更简单的方法来捕获深层 JSON 子级别的信息,而不必一直输入它?

There are 2 problems:有2个问题:

  • The data you are loading is not a valid json .您正在加载的数据不是有效的json

  • Autor is a list of dicts, but you are trying to access it as a dict . Autor是一个 dicts list ,但您试图将其作为dict访问。


I suggest you to try python-benedict , it's an open-source dict subclass with many features, including standardized I/O operations and keypath support.我建议您尝试python-benedict ,它是一个开源dict子类,具有许多功能,包括标准化的 I/O 操作和 keypath 支持。 (Disclosure: I am the author). (披露:我是作者)。 https://github.com/fabiocaccamo/python-benedict https://github.com/fabiocaccamo/python-benedict

Installation: pip install python-benedict安装: pip install python-benedict

Then:然后:

from benedict import benedict as bdict

data_source = {
    'DetalheMateria': {
        '@xmlns:xsi': 'http://www.w3.org/2001/XMLSchema-instance',
        '@xsi:noNamespaceSchemaLocation': 'http://legis.senado.leg.br/dadosabertos/dados/DetalheMateriav5.xsd',
        'Metadados': {
            'Versao': '03/12/2019 21:36:18',
            'VersaoServico': '5',
            'DataVersaoServico': '2017-02-01',
            'DescricaoDataSet': 'Dados básicos da matéria, incluindo autoria, norma gerada e outras informações. A partir de fevereiro de 2019, os requerimentos de comissões permanentes passam a ser numerados com a mesma sistemática dos requerimentos das comissões temporárias, seguindo, portanto, o padrão: REQ 99/2019 - SIGLA_COMISSÃO. Dessa forma, para se buscar um requerimento de determinada comissão (com ano a partir de 2019), deve-se informar .../materia/sigla/número/ano?comissao=sigla da comissão.'
        },
        'Materia': {
            'IdentificacaoMateria': {
                'CodigoMateria': '20050',
                'SiglaCasaIdentificacaoMateria': 'SF',
                'NomeCasaIdentificacaoMateria': 'Senado Federal',
                'SiglaSubtipoMateria': 'PLC',
                'DescricaoSubtipoMateria': 'PROJETO DE LEI DA CÂMARA',
                'NumeroMateria': '00035',
                'AnoMateria': '1988',
                'DescricaoObjetivoProcesso': 'Revisora',
                'DescricaoIdentificacaoMateria': 'PLC 35/1988',
                'IndicadorTramitando': 'Não'
            },
            'DadosBasicosMateria': {
                'EmentaMateria': "DECLARA FERIADO NACIONAL O DIA 20 DE NOVEMBRO, ANIVERSARIO DA MORTE   \n      DE ZUMBI DOS PALMARES, CONSAGRADO PELA COMUNIDADE AFRO-BRASILEIRA     \n      COMO 'DIA NACIONAL DA CONSCIENCIA NEGRA.'                          \n      ",
                'IndicadorComplementar': 'Não',
                'DataApresentacao': '1987-12-01',
                'DataLeitura': '1987-12-01'
            },
            'Autoria': {
                'Autor': [
                    {'NomeAutor': 'Câmara dos Deputados', 'SiglaTipoAutor': 'CAMARA', 'DescricaoTipoAutor': 'Câmara dos Deputados', 'NumOrdemAutor': '1', 'IndicadorOutrosAutores': 'Não'}
                ]
            },
            'Iniciativa': {
                'SiglaTipoIniciativa': 'DEPUTADO',
                'DescricaoTipoIniciativa': 'Deputado',
                'DescricaoIniciativa': 'BENEDITA DA SILVA'
            },
            'OrigemMateria': {
                'SiglaCasaOrigem': 'CD',
                'NomeCasaOrigem': 'Câmara dos Deputados'
            },
            'CasaIniciadoraNoLegislativo': {
                'SiglaCasaIniciadora': 'SF',
                'NomeCasaIniciadora': 'Senado Federal'
            },
            'OutrosNumerosDaMateria': {
                'OutroNumeroDaMateria': {
                    'IdentificacaoMateria': {
                        'SiglaCasaIdentificacaoMateria': 'CD',
                        'NomeCasaIdentificacaoMateria': 'Câmara dos Deputados',
                        'SiglaSubtipoMateria': 'PL',
                        'DescricaoSubtipoMateria': 'PROJETO DE LEI',
                        'NumeroMateria': '00293',
                        'AnoMateria': '1987'
                    },
                    'DescricaoTipoNumeracao': 'CasaIniciadora'
                }
            },
            'SituacaoAtual': {
                'Autuacoes': {
                    'Autuacao': [
                        {
                            'NumeroAutuacao': '1',
                            'Situacao': {
                                'DataSituacao': '1996-01-23',
                                'CodigoSituacao': '28',
                                'SiglaSituacao': 'ARQVD',
                                'DescricaoSituacao': 'ARQUIVADA AO FINAL DA LEGISLATURA'
                            },
                            'Local': {
                                'DataLocal': '1996-01-23',
                                'CodigoLocal': '206',
                                'TipoLocal': 'A',
                                'SiglaCasaLocal': 'SF',
                                'NomeCasaLocal': 'Senado Federal',
                                'SiglaLocal': 'SSEXP',
                                'NomeLocal': 'SUBSECRETARIA DE EXPEDIENTE'
                            }
                        }
                    ]
                }
            },
            'OutrasInformacoes': {
                'Servico': [
                    {
                        'NomeServico': 'EmendaMateria',
                        'DescricaoServico': 'Emendas da matéria',
                        'UrlServico': 'http://legis.senado.leg.br/dadosabertos/materia/emendas/20050?v=6'
                    },
                    {
                        'NomeServico': 'MovimentacaoMateria',
                        'DescricaoServico': 'Movimentações da matéria, como tramitações, despachos e prazos.\n      Evoluções:\n      14/8/2019\n      - criada nova Tag "DeliberacoesMPV" para as deliberações de MPV;\n - criada nova Tag "DescricaoItemCalendario" subord',
                        'UrlServico': 'http://legis.senado.leg.br/dadosabertos/materia/movimentacoes/20050?v=6'
                    },
                    {
                        'NomeServico': 'RelatoriaMateria',
                        'DescricaoServico': 'Relatoria atual e relatorias encerradas (histórico) da matéria',
                        'UrlServico': 'http://legis.senado.leg.br/dadosabertos/materia/relatorias/20050?v=5'
                    },
                    {
                        'NomeServico': 'TextoMateria',
                        'DescricaoServico': 'Textos da matéria. \n      Evoluções da versão: \n      28/8/2019 - incluída a tag "AutoriaTexto", sob a tag "Texto".',
                        'UrlServico': 'http://legis.senado.leg.br/dadosabertos/materia/textos/20050?v=5'
                    },
                    {
                        'NomeServico': 'VotacaoMateria',
                        'DescricaoServico': 'Votações da matéria',
                        'UrlServico': 'http://legis.senado.leg.br/dadosabertos/materia/votacoes/20050?v=5'
                    },
                    {
                        'NomeServico': 'VotacoesComissao',
                        'UrlServico': 'http://legis.senado.leg.br/dadosabertos/votacaoComissao/materia/PLC/00035/1988?v=1'
                    }
                ]
            },
            'UrlGlossario': 'http://legis.senado.leg.br/dadosabertos/glossario/lista'
        }
    }
}

data = bdict(data_source)

# once your url will return a valid json you could just do:
# data = bdict.from_json('http://legis.senado.leg.br/dadosabertos/materia/20050')

author = data[['DetalheMateria', 'Materia', 'Autoria', 'Autor']][0]
# or: author = data['DetalheMateria.Materia.Autoria.Autor'][0]
author_name = author['NomeAutor']
print(author_name) # --> Câmara dos Deputados

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 从 INSEE API 解析多层 JSON - Parse a multi-layered JSON from INSEE API Python中的多处理多层图像合并 - Multiprocessing multi-layered image merging in Python Python-创建多层PDF - Python - create a multi-layered PDF 如何更新两层多层感知器中的学习率? - How to update the learning rate in a two layered multi-layered perceptron? 没有[href]的多层网站上的Python网络抓取 - Python web-scraping on a multi-layered website without [href] grep多层迭代匹配的字符串(Python) - Grep multi-layered iterable for strings that match (Python) 按多层元组的多层元素排序 - Python - Sort by elements in multiple layers of multi-layered tuple - Python 如何在多层python字典中找到最小值,以及它的“路径”(即叶值的键列表) - How to find the smallest value in a multi-layered python dictionary, along with “path” to it (i.e. list of keys to the leaf value) 使用 Python pandas 将具有逗号值的字符串转换为多层索引的单独行 - Turning a string with comma values into individual rows of a multi-layered index with Python pandas 创建可访问每一层变量的多层Python类 - Creating multi-layered Python classes with access to variables within each layer
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM