我在从HTTP响应中获取数据时遇到问题。遗憾的是,这种格式会以' \ n'附加到所有键/值对。 JSON说它必须是str而不是" bytes"。
我尝试了一些修复程序,因此我的包含列表可能看起来很奇怪/多余。任何建议将不胜感激。
#!/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"
答案 0 :(得分: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的原因。
答案 1 :(得分:1)
Bytes对象有方法decode()
,它将字节转换为字符串。检查浏览器中的响应,似乎在字符串的开头有一些额外的字符需要删除(换行符,后跟两个斜杠:'\ n //')。要跳过decode()
方法返回的字符串中的前三个字符,我们在方法调用后添加[3:]
。
data = json.loads(content.decode()[3:])
print(data[0]['id'])
输出正是您所期望的:
22144
答案 2 :(得分:-1)
JSON说它必须是str而不是"字节"。
您的内容为" bytes",您可以按照以下方式执行此操作。
data = json.loads(content.decode())