2014-04-13 46 views
14

解析HTTP響應我想在THIS URL操作的信息。我可以成功打開它並閱讀它的內容。但是我真正想要做的是拋棄所有我不想要的東西,並操縱我想要保留的東西。在Python

有沒有辦法將字符串轉換爲字典,以便我可以迭代它?或者我只需要解析它(str類型)?

from urllib.request import urlopen 

url = 'http://www.quandl.com/api/v1/datasets/FRED/GDP.json' 
response = urlopen(url) 

print(response.read()) # returns string with info 

回答

38

此問題已解決。

當我打印response.read()我注意到b被預先寫入字符串(例如b'{"a":1,..)。 「b」代表字節,用作所處理對象類型的聲明。既然,我知道一個字符串可以通過使用json.loads('string')轉換爲字典,我只需要將字節類型轉換爲字符串類型。我通過解碼對utf-8 decode('utf-8')的響應來做到這一點。一旦它在字符串類型中,我的問題就解決了,我很容易就可以遍歷dict

我不知道這是否是最快或最「pythonic」的寫作方式,但它的工作原理和總是時間後優化和改進!我的解決方案的完整代碼:

from urllib.request import urlopen 
import json 

# Get the dataset 
url = 'http://www.quandl.com/api/v1/datasets/FRED/GDP.json' 
response = urlopen(url) 

# Convert bytes to string type and string type to dict 
string = response.read().decode('utf-8') 
json_obj = json.loads(string) 

print(json_obj['source_name']) # prints the string with 'source_name' key 

如果有人想通過谷歌找到這個,我希望這有助於。我可以給出最好的建議,仔細閱讀你的錯誤,並密切關注你接受的輸出。

-1

我猜python 3.4中的東西已經改變了。這爲我工作:

print("resp:" + json.dumps(resp.json())) 
+2

沒有'json'屬性。不要混淆'request'庫和'urllib.request'。 – jfs

4

json作品與Unicode文本在Python 3(JSON格式本身的定義只在Unicode文本而言),因此,你需要解碼的HTTP響應接收的字節。 r.headers.get_content_charset('utf-8')得到您的字符編碼:

#!/usr/bin/env python3 
import io 
import json 
from urllib.request import urlopen 

with urlopen('https://httpbin.org/get') as r, \ 
    io.TextIOWrapper(r, encoding=r.headers.get_content_charset('utf-8')) as file: 
    result = json.load(file) 
print(result['headers']['User-Agent']) 

這是沒有必要在這裏使用io.TextIOWrapper

#!/usr/bin/env python3 
import json 
from urllib.request import urlopen 

with urlopen('https://httpbin.org/get') as r: 
    result = json.loads(r.read().decode(r.headers.get_content_charset('utf-8'))) 
print(result['headers']['User-Agent']) 
+0

在Python 3中,使用'r.msg.get_content_charset'。 https://docs.python.org/3/library/http.client.html#http.client.HTTPResponse.msg –

+0

@ PeppeL-G:來自'HTTPResponse'源文件:*「'headers'在這裏使用並支持'urllib''msg'提供作爲HTTP客戶端向後兼容層。「* – jfs

+0

哦,對不起,我沒有Python中的很多經驗,但你可能是正確的。我用'HTTPResponse'類工作從'http.client'模塊,我現在看到有一些差異(這個類既包含了'msg'場和'headers'場(值相同),但只有我發現了'msg'字段的文檔,所以我認爲'headers'是爲了向後兼容而保留的。我的錯誤 –

6

您也可以使用Python的請求庫,而不是。

import requests 

url = 'http://www.quandl.com/api/v1/datasets/FRED/GDP.json'  
response = requests.get(url)  
dict = response.json() 

現在你可以像Python字典一樣操縱「字典」了。