2012-12-03 141 views
0

我想寫一個python腳本,它將從http服務器檢索值並將數據更改爲csv格式,我使用httplib2庫來執行請求,但我的問題是返回的內容是在應用程序/ x-www-form-urlencoded格式,我有代碼解析數據爲字典,但似乎無法做任何事情,因爲這種字符串,我知道它可能看起來簡單廣泛的用戶,因爲我似乎無法找到這個通過研究任何信息...從http請求格式化返回python

下面

是一個示例代碼,只是想說明的,我試圖做的事情的類型和我的問題

import httplib2 
http = httplib2.Http() 

resp, content = http.request("http://example.com/foo/bar") 

謝謝你的幫助

順便說一句,我使用python 2.7和要求自然返回格式是JSON

回答

2

如果您收到了編碼的響應,您可以使用urllib.unquote的轉義字符替換成自己的'實際'表示。一旦你這樣做了,你可以使用json模塊作爲Python對象加載字符串,然後使用csv模塊根據響應創建CSV。您迴應的結構將決定如何將設置你的目的,但希望這將讓你在正確的道路上:

In [1]: import csv 

In [2]: import json 

In [3]: import urllib 

In [4]: json_resp = urllib.quote('[{"name": "John Doe", "age": 35}, {"name": "Jane Doe", "age": 33}]') 

In [5]: json_resp # What I believe your response looks like 
Out[5]: '%5B%7B%22name%22%3A%20%22John%20Doe%22%2C%20%22age%22%3A%2035%7D%2C%20%7B%22name%22%3A%20%22Jane%20Doe%22%2C%20%22age%22%3A%2033%7D%5D' 

In [6]: resp = urllib.unquote(json_resp) #'Unquote' the response 

In [7]: resp 
Out[7]: '[{"name": "John Doe", "age": 35}, {"name": "Jane Doe", "age": 33}]' 

In [8]: content = json.loads(resp) # Turn the resp into a Python object 

In [9]: fieldnames = ('name', 'age') # Specify the order in which to write fields 

In [10]: with open('mycsv.csv', 'wb') as f: 
    ....:  writer = csv.DictWriter(f, fieldnames) 
    ....:  writer.writeheader() # Python 2.7+ 
    ....:  for item in content: 
    ....:   writer.writerow(item) 
    ....: 
    ....: 

這會寫一個CSV,看起來像:

name,age 
John Doe,35 
Jane Doe,33 
+0

謝謝你的迴應,我已經提出了它,因爲這是一個非常好的答案,但我應該指定我收到的'內容',對我來說看起來像json,我猶豫發佈確切的回覆,因爲它是發票I正在檢索。但它看起來像你在第7行,另外兩個維度,雖然如果我嘗試將它傳遞到json.loads()函數它返回一個ValueError:沒有Json對象...這似乎很奇怪,我已經嘗試了所有其他解決方案,我可以在網絡上找到 – jbaldwin

+1

@jbaldwin呃,這讓它變得簡單一點:)然後,檢查一下是響應本身 - 它是否顯示爲有效格式,意思是雙倍 - 用於包含輔助對象的引號,都與關閉的'}匹配,所有列表正確關閉,沒有額外的逗號等。您可以使用基本的有效JSON字符串測試當前技術(如上面的例子) - 如果它起作用,這將是響應本身的問題。 – RocketDonkey

+0

我在某個論壇上使用了json'checker'鏈接到某個論壇的人,http://jsonlint.com/當我將代碼放在這裏時,它說:「解析第45行的錯誤: ...」v「:(2010, -----------------------^ 期待'STRING','NUMBER','NULL','TRUE','FALSE',' {''''''但是我對java的瞭解不多,當我以不同的方式來看待這個問題時,有時我會得到newDate(2010 ...然後當我查看它時,它說它是用於數據格式,那麼數據的格式化仍然有效? – jbaldwin