2017-01-06 81 views
0

我在从HTTP响应中获取数据时遇到问题。不幸的是,格式会返回所有键/值对附加的'\ n'。 JSON说它必须是一个str而不是“字节”。无法从http请求中提取JSON

我已经尝试了一些修复程序,所以我的列表可能看起来很奇怪/多余。任何建议,将不胜感激。

#!/usr/bin/env python3 

import urllib.request 
from urllib.request import urlopen 
import json 
import requests 

url = "http://finance.google.com/finance/info?client=ig&q=NASDAQ,AAPL" 
response = urlopen(url) 
content = response.read() 
print(content) 

data = json.loads(content) 
info = data[0] 
print(info) 
#got this far - planning to extract "id:" "22144" 
+1

您包括请求[用法](http://stackoverflow.com/questions/16877422/parsing-json-responses)吧! –

回答

3

当谈到在Python中发出请求时,我个人喜欢使用requests库。我觉得它更易于使用。

import json 
import requests 

r = requests.get('http://finance.google.com/finance/info?client=ig&q=NASDAQ,AAPL') 
json_obj = json.loads(r.text[4:]) 

print(json_obj[0].get('id')) 

将上述溶液打印:22144

的响应数据在头部有一对夫妇不必要的字符,这就是为什么我只加载响应的相关(JSON)部分:r.text[4:]。这就是为什么你最初无法将它加载为json的原因。

+0

是的,正斜杠搞乱了JSON解码。 – deweyredman

+0

正如@deweyredman提到的,使用r.json()会引发错误,因为响应在开头处有正斜杠(无效的json格式)。 –

-1

JSON表示它必须是一个str而不是“字节”。

你的内容是“字节”,你可以这样做,如下所示。

data = json.loads(content.decode()) 
+0

你试过这个吗? –

+0

对不起,Google在中国无法访问。我的意思是一个通用的解决方案 – lxyscls

+0

哦,好吧,你解释了这个问题的错误。但是,由于与响应一起发送的额外字符,这仍然会导致错误。 –

1

字节对象有方法decode()它将字节转换为字符串。在浏览器中检查响应,似乎在需要删除的字符串开始处有一些额外的字符(换行符,后跟两个斜杠:'\ n //')。要跳过decode()方法返回的字符串中的前三个字符,我们在方法调用后添加[3:]

data = json.loads(content.decode()[3:]) 
print(data[0]['id']) 

输出正是你所期望的:

22144