2017-04-06 3 views
0

python 3.4를 사용하고 URL에서 올바른 JSON 출력이 무엇인지 파싱하려고합니다. 예는 : http://api.stackexchange.com/2.2/questions?order=desc&sort=activity&site=stackoverflowJSON 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

스크립트는 GitHub의 및 다른 많은 사람들처럼, 다른 API와 함께 작동과 같은 오류를 얻을처럼 내 코드는 모습입니다 만 stackexchange API가 아닌

+0

@DanD. '식별자에 잘못된 문자가 있습니다 .' 그리고'헤더 뒤에'.'를 가리 킵니다. – user7342807

답변

2

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 버전을 사용하고 있습니까? 그것은 나를 위해 파이썬 3.6에서 작동합니다. – Rishav

+0

'python3 -V'는'3.4.5'를 보여줍니다. 이전 Python 용으로 편집 된'python3 fetch_url.py' – user7342807