[英]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.