首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从网站下载Json数据

从网站下载Json数据
EN

Stack Overflow用户
提问于 2018-05-18 23:38:30
回答 2查看 326关注 0票数 0

我正在尝试编写一个python脚本,它将每次接受一组url,并获取该url的响应内容,并将其存储为json文件。

下面是我最初为获得url的响应而写的

代码语言:javascript
复制
def download_json()

    params={'id':00163E0BD0C1FA89,
            'list':'141',
            'queue': 'gen',
            'type': 'abc_stat'
           }



    req_obj= requests.get(link, params=params)
    print(req_obj.url)
    print(req_obj.status_code)

    return req_obj

它创建正确的url,就像我在浏览器中直接复制url一样,它以json格式显示输出。下面是我在浏览器上看到的一行json输出:

代码语言:javascript
复制
{
  "DATA" : [
    {
      "SCHEMA" : "abc_4_QAATu2.",
      "ID" : "QAATu2",
      "IM_ID" : "22faba86_c9e0_4dbc",
      "S_NUMBER" : "502379284",
      "CONFIG_TYPE" : "las_home_type",
      "CONFIG_KEY" : "las_home_key",
      "CONFIG_LONG_V" : "1",
      "CONFIG_STRING_V" : "https://abc-deg/development",
      "MODIFIED_DATE" : "Unknown"
    },

因此,这确实表明,当我在浏览器中直接输入url时,数据以json格式返回。

但是,我的请求对象对于头文件有如下内容:

Out26

代码语言:javascript
复制
{'content-length': '15457', 'expires': '0', 'content-encoding': 'gzip', 'cache-control': 'no-cache, no-store, private', 'set-cookie': 'login-XSRF_RZA=2018051-axJnifQUpOnrS8WCFI; path=/abc/deo/cpo; secure; HttpOnly, usercontext=client=002; path=/', 'content-type': 'text/html; charset=utf-8', 'pragma': 'no-cache, no-store, private'}

现在,当我执行requests.json()来获取json对象中的数据时,我得到了以下错误

代码语言:javascript
复制
JSONDecodeError                           Traceback (most recent call last)
<ipython-input-28-4cfc1a694fcf> in <module>()
----> 1 req_obj.json()

/Users/anaconda/envs/dl/lib/python3.5/site-packages/requests/models.py in json(self, **kwargs)
    890                     # used.
    891                     pass
--> 892         return complexjson.loads(self.text, **kwargs)
    893 
    894     @property

/Users/anaconda/envs/dl/lib/python3.5/json/__init__.py in loads(s, encoding, cls, object_hook, parse_float, parse_int, parse_constant, object_pairs_hook, **kw)
    317             parse_int is None and parse_float is None and
    318             parse_constant is None and object_pairs_hook is None and not kw):
--> 319         return _default_decoder.decode(s)
    320     if cls is None:
    321         cls = JSONDecoder

/Users/anaconda/envs/dl/lib/python3.5/json/decoder.py in decode(self, s, _w)
    337 
    338         """
--> 339         obj, end = self.raw_decode(s, idx=_w(s, 0).end())
    340         end = _w(s, end).end()
    341         if end != len(s):

/Users/anaconda/envs/dl/lib/python3.5/json/decoder.py in raw_decode(self, s, idx)
    355             obj, end = self.scan_once(s, idx)
    356         except StopIteration as err:
--> 357             raise JSONDecodeError("Expecting value", s, err.value) from None
    358         return obj, end

JSONDecodeError: Expecting value: line 2 column 1 (char 2)

编辑:

如果您在上面的标题中看到,content_type将显示为html,即使在浏览器上它也显示json作为输出。

但是当我做的时候

代码语言:javascript
复制
req_obj.json 

<bound method Response.json of <Response [200]>>

但是req_obj.json()给出了以下错误。

知道当输出实际上是json格式时,为什么不能将数据转换成json格式,如上面所示?谢谢

EN

回答 2

Stack Overflow用户

发布于 2018-05-19 00:08:50

根据文档

如果JSON解码失败,r.json()将引发异常。例如,如果响应获得204 (无内容),或者响应包含无效的JSON,则尝试r.json()引发ValueError: No JSON object could be decoded.

虽然它没有抛出相同的错误消息,但原因似乎是一样的:您可能没有得到JSON作为回答,这就解释了为什么JSONDecode会抛出异常。

您应该能够通过打印req_obj.text而不是使用req_obj.json()来确认这一点。

至于如何修复它,我怀疑在使用浏览器发出的请求和使用Python发出的请求(例如不同的参数)之间肯定有一些不同。

我建议您阅读,以进一步调查问题的根源。

票数 0
EN

Stack Overflow用户

发布于 2018-05-19 00:13:39

根据这份文件:http://docs.python-requests.org/en/master/

您可以检查req_obj.status_coder.headers['content-type']。如果status_code为200,内容类型为'application/json; charset=utf8',则可以尝试检查req_obj.json()

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50420451

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档