解析JSON数据时出错

use*_*307 8 python google-api google-earth python-3.x

我想根据纬度和经度从Google地球获取高程数据,但我无法做到这一点.我不确定我做错了什么,但我的代码如下所示.

def getElevation(locations,sensor="true", **elvtn_args):
    elvtn_args.update({
        'locations': locations,
        'sensor': sensor
    })

    url = ELEVATION_BASE_URL
    params =  urllib.parse.urlencode(elvtn_args)
    baseurl = url +"?"+ params;
    req = urllib.request.urlopen(str(baseurl));
    response = simplejson.load(req);
Run Code Online (Sandbox Code Playgroud)

而我得到的错误是:

Traceback (most recent call last):
  File "D:\GIS\Arctools\ElevationChart - Copy.py", line 85, in <module>
    getElevation(pathStr)
  File "D:\GIS\Arctools\ElevationChart - Copy.py", line 45, in getElevation
    response = simplejson.load(req);
  File "C:\Python32\lib\json\__init__.py", line 262, in load
    parse_constant=parse_constant, object_pairs_hook=object_pairs_hook, **kw)
  File "C:\Python32\lib\json\__init__.py", line 307, in loads
    return _default_decoder.decode(s)
  File "C:\Python32\lib\json\decoder.py", line 351, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
TypeError: can't use a string pattern on a bytes-like object
Run Code Online (Sandbox Code Playgroud)

任何帮助赞赏.

jds*_*ojr 11

邮政有点晚了,但最近遇到了同样的问题.下面的解决方案对我有用.基本上是Lennart所说的.

from urllib import request
import json

req = request.urlopen('https://someurl.net/api')
encoding = req.headers.get_content_charset()
obj = json.loads(req.read().decode(encoding))
Run Code Online (Sandbox Code Playgroud)


Len*_*bro 6

在Python 3中,二进制数据(例如http请求的原始响应)存储在字节对象中.json/simplejson期待字符串.解决方案是使用适当的编码将字节数据解码为字符串数据,您可以在标头中找到该编码.

你找到编码:

encoding = req.headers.get_content_charset()
Run Code Online (Sandbox Code Playgroud)

然后,您通过以下方式将内容设为字符串

body = req.readall().decode(encoding)
Run Code Online (Sandbox Code Playgroud)

然后你可以将这个主体传递给json加载器.

(另外,请停止调用响应"req".这令人困惑,并使它听起来像是一个请求,但事实并非如此.)

  • @ user876307:没有"改变",有几个需要.首先,你需要弄清楚响应的编码.我会更新答案.另外,写4条评论是没有意义的.一个本来就足够了. (2认同)