解析JSON URL时的Python unicodeDecodeError

问题描述:

我正在使用python 3.4并试图解析看起来像从URL有效的JSON输出。例如: http://api.stackexchange.com/2.2/questions?order=desc&sort=activity&site=stackoverflow解析JSON URL时的Python unicodeDecodeError

这是我的代码是什么样子

import json 
from urllib.request import urlopen 


def jsonify(url): 
    response = urlopen(url).read().decode('utf8') 
    repo = json.loads(response) 
    return repo 


url = jsonify('http://api.stackexchange.com/2.2/questions?order=desc&sort=activity&site=stackoverflow'); 

不过,我得到的错误,如UnicodeDecodeError utf-8 codec can't decode byte 0x8b in position 1; invalid start byte

该脚本适用于任何其他的API,像github上和许多其他人,但不与stackexchange api

+0

@DanD。我得到'标识符中的无效字符',它指向'headers'后面的'.'。 – user7342807

该响应使用gzip进行压缩,您必须对其进行解压缩。

$ curl -v http://api.stackexchange.com/2.2/questions\?order\=desc\&sort\=activity\&site\=stackoverflow 
* Trying 198.252.206.16... 
* TCP_NODELAY set 
* Connected to api.stackexchange.com (198.252.206.16) port 80 (#0) 
> GET /2.2/questions?order=desc&sort=activity&site=stackoverflow HTTP/1.1 
> Host: api.stackexchange.com 
> User-Agent: curl/7.51.0 
> Accept: */* 
> 
< HTTP/1.1 200 OK 
< Cache-Control: private 
< Content-Type: application/json; charset=utf-8 
< Content-Encoding: gzip 

有关更多详细信息,请参阅api.stackexchange docs。减压

实施例:

import gzip 

def jsonify(url): 
    response = urlopen(url).read() 
    tmp = gzip.decompress(response).decode('utf-8') 
    repo = json.loads(tmp) 
    return repo 
+0

它仍然不起作用。我得到TypeError:JSON对象必须是'str'而不是'bytes'' – user7342807

+0

@ user7342807不起作用?你在哪个Python版本上?它适用于Python 3.6。 – Rishav

+0

'python3 -V'显示'3.4.5'我通过'python3 fetch_url.py'执行我的脚本。 – user7342807