我正在尝试编写一个python脚本,它将一次获取一堆url并获取该url的响应内容并将其存储为json文件。
以下是我最初为了获取网址
的回复而写的内容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输出:
{
"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格式返回。
但是我的请求对象有标题:
缺货[26]:
{'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 python对象中的数据时,我收到以下错误
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作为输出
但是当我这样做时
req_obj.json
<bound method Response.json of <Response [200]>>
但是req_obj.json()给出了以下错误。
知道为什么当输出实际上是json格式时,它无法将数据转换为json格式,如上所示?感谢
答案 0 :(得分:0)
如果JSON解码失败,
r.json()
会引发异常。对于 例如,如果响应获得204(无内容),或者响应 包含无效的JSON,尝试r.json()
引发ValueError: No JSON object could be decoded.
虽然它没有抛出相同的错误消息,但原因似乎是相同的:您可能没有将JSON作为答案,这可以解释为什么JSONDecode
抛出异常
您应该可以通过打印req_obj.text
而不是使用req_obj.json()
来确认这一点。
至于如何修复它,我怀疑使用浏览器的请求和使用Python的请求(例如不同的参数)之间必然存在不同之处。
我建议您阅读this以进一步调查问题的根源。
答案 1 :(得分:0)
根据这份文件:http://docs.python-requests.org/en/master/
您可以查看componentWillMount
和req_obj.status_code
。如果status_code为200且内容类型为r.headers['content-type']
,则您可以尝试检查'application/json; charset=utf8'
。