【问题标题】:Python unicodeDecodeError on parsing a JSON urlPython unicodeDecodeError 解析 JSON url
【发布时间】:2017-04-06 14:52:28
【问题描述】:

我正在使用 python 3.4 并尝试从 url 解析看似有效的 JSON 输出。前任: http://api.stackexchange.com/2.2/questions?order=desc&sort=activity&site=stackoverflow

这就是我的代码的样子

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 和许多其他 API,但不适用于 stackexchange api

【问题讨论】:

  • @DanD。我得到Invalid character in identifier,它指向headers之后的.

标签: python python-3.x stackexchange-api


【解决方案1】:

响应是使用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

【讨论】:

  • 还是不行。我得到TypeError: the JSON object must be 'str' not 'bytes'
  • @user7342807 不起作用?你在哪个 Python 版本上?它适用于 Python 3.6。
  • python3 -V 显示3.4.5 我正在通过python3 fetch_url.py 执行我的脚本
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-21
  • 1970-01-01
  • 1970-01-01
  • 2017-05-31
  • 2012-01-03
相关资源
最近更新 更多