python - 如何通过 API 请求提取 JSON 内容?

标签 python json xml python-requests

在 Python 3 中,我想从巴西公共(public)服务访问 API:http://legis.senado.leg.br/dadosabertos/docs/ui/index.html#/PesquisaMateriaService

文档还提到内容可能来自 application/json: http://legis.senado.leg.br/dadosabertos/docs/resource_PesquisaMateriaService.html#resource_PesquisaMateriaService_materiaListaPesquisa_GET

我的意图是通过请求进行访问,然后生成 JSON。我使用“ano”过滤器进行了测试

import requests

url = 'http://legis.senado.leg.br/dadosabertos/materia/pesquisa/lista?ano=2018'

try:
    r = requests.get(url)
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()

但是出现了这个错误消息:

---------------------------------------------------------------------------
JSONDecodeError                           Traceback (most recent call last)
<ipython-input-2-aa958e05ad1d> in <module>
     12     print ("OOps: Something Else",err)
     13 
---> 14 projects = r.json()

~/Documentos/Code/apis/lib/python3.6/site-packages/requests/models.py in json(self, **kwargs)
    895                     # used.
    896                     pass
--> 897         return complexjson.loads(self.text, **kwargs)
    898 
    899     @property

/usr/lib/python3.6/json/__init__.py in loads(s, encoding, cls, object_hook, parse_float, parse_int, parse_constant, object_pairs_hook, **kw)
    352             parse_int is None and parse_float is None and
    353             parse_constant is None and object_pairs_hook is None and not kw):
--> 354         return _default_decoder.decode(s)
    355     if cls is None:
    356         cls = JSONDecoder

/usr/lib/python3.6/json/decoder.py in decode(self, s, _w)
    337 
    338         """
--> 339         obj, end = self.raw_decode(s, idx=_w(s, 0).end())
    340         end = _w(s, end).end()
    341         if end != len(s):

/usr/lib/python3.6/json/decoder.py in raw_decode(self, s, idx)
    355             obj, end = self.scan_once(s, idx)
    356         except StopIteration as err:
--> 357             raise JSONDecodeError("Expecting value", s, err.value) from None
    358         return obj, end

JSONDecodeError: Expecting value: line 1 column 1 (char 0)

我查看了“r”的内容,出现的是一个 XML。部分内容:

r.content

b'<?xml version = \'1.0\' encoding=\'UTF-8\'?>\n<PesquisaBasicaMateria xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://legis.senado.gov.br/dadosabertos/dados/PesquisaBasicaMateriav5.xsd">\n   <Metadados>\n      <Versao>11/01/2019 17:27:18</Versao><VersaoServico>5</VersaoServico><DataVersaoServico>2017-02-01</DataVersaoServico><DescricaoDataSet>Efetua a pesquisa de mat\xc3\xa9rias, com a cria\xc3\xa7\xc3\xa3o de um filtro atrav\xc3\xa9s dos par\xc3\xa2metros que podem ser informados.\n      Se n\xc3\xa3o informar par\xc3\xa2metro algum, n\xc3\xa3o retorna conte\xc3\xbado.</DescricaoDataSet>\n   </Metadados>\n   <Materias>\n      <Materia><IdentificacaoMateria><CodigoMateria>132317</CodigoMateria><SiglaCasaIdentificacaoMateria>SF</SiglaCasaIdentificacaoMateria><NomeCasaIdentificacaoMateria>Senado Federal</NomeCasaIdentificacaoMateria><SiglaSubtipoMateria>ACE</SiglaSubtipoMateria><DescricaoSubtipoMateria>AVISO DA COMISS\xc3\x83O DE EDUCA\xc3\x87\xc3\x83O</DescricaoSubtipoMateria><NumeroMateria>00001</NumeroMateria><AnoMateria>2018</AnoMateria>

请问有没有办法访问 JSON 格式的内容?

最佳答案

查看 Swagger API 文档。您需要设置以下 HTTP header :

headers = {"Accept" : "application/json"}
r = requests.get(url, headers=headers)

关于python - 如何通过 API 请求提取 JSON 内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54153232/

相关文章:

python - 使用 Python 3.7 导入 pyobjc AppKit 时如何消除不需要的调试输出

c# - 类似于 GSON 的 Json.NET 松散类型选项

json - 将 json.RawMessage 转换为结构的正确方法是什么?

在字典中设置值的pythonic方式

c# - 在 C# 中将 Parallel.ForEach 与 XmlNodeList 结合使用

android - Xml getText 返回 null - Android

python - 如何使用 GDAL VRT 将图像作为光栅带堆叠在单个 GeoTiff 中?

Python 生成随机的 128 位字符串

python - 使用 Python 计算 P**n 而 n 接近 +oo 并且 P 是矩阵

c# - 正确阅读 XML 有困难