我正在尝试从以下API端点https://datos.madrid.es/egob/catalogo/205026-0-cementerios.json
获取响应JSON。我的代码是:
import requests
url = 'https://datos.madrid.es/egob/catalogo/205026-0-cementerios.json'
r = requests.get(url)
r.json()
它失败并显示以下错误:
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
如果我从请求中获取编码,则为空。因此,我尝试在访问之前强制编码,但没有成功:
import requests
url = 'https://datos.madrid.es/egob/catalogo/205026-0-cementerios.json'
r = requests.get(url)
r.encoding = 'utf-8'
r.json()
给出相同的错误。
r.text
返回类似的内容
'\x00\x00\x01\x00\x01\x00 \x00\x00\x01\x00\x18\x0 .......
所以看起来它没有正确解码响应。
如何才能成功解码?
答案 0 :(得分:2)
似乎已压缩。解压缩它,然后使用json.decode
。编码为utf-8
。
示例:
import zlib
decompressed_data=zlib.decompress(f.read(), 16+zlib.MAX_WBITS)
您的URL是公开的,您可以使用自己喜欢的浏览器对其进行测试。 Chrome提供以下标题:
Cache-Control: no-cache
Connection: Keep-Alive
Content-disposition: inline;filename=205026-0-cementerios.json
Content-Encoding: gzip
Content-Length: 4383
Content-Type: application/json;charset=UTF-8
Date: Thu, 20 Dec 2018 12:19:33 GMT
OT-force-Account-Verify: true
Vary: Accept-Encoding
X-Frame-Options: SAMEORIGIN
X-UA-Compatible: IE=8
Xonnection: close
解压缩后看起来不错json
:
{
"@context": {
"c": "http://www.w3.org/2002/12/cal#",
"dcterms": "http://purl.org/dc/terms/",
"geo": "http://www.w3.org/2003/01/geo/wgs84_pos#",
"loc": "http://purl.org/ctic/infraestructuras/localizacion#",
"org": "http://purl.org/ctic/infraestructuras/organizacion#",
"vcard": "http://www.w3.org/2006/vcard/ns#",
"title": "vcard:fn",
"id": "dcterms:identifier",
"relation": "dcterms:relation",
"references": "dcterms:references",
"address": "vcard:adr",
"area": "loc:barrio",
"district": "loc:distrito",
"locality": "vcard:locality",
"postal-code": "vcard:postal-code",
"street": "vcard:street-address",
"location": "vcard:geo",
"latitude": "geo:lat",
"longitude": "geo:long",
....
答案 1 :(得分:2)
服务器正在使用用户代理标头进行一些时髦的操作(即,如果无法识别该图标,则返回该图标!)。您可以通过强制用户代理来解决此问题:
this