2012-10-01 71 views
1

我想打開StackExchange API(搜索端點)URL並解析結果[0]。文檔說所有的結果都是JSON格式[1]。我在我的網頁瀏覽器中打開了這個URL,結果非常好[2]。但是,當我嘗試使用Python程序打開它時,它會返回我無法解析的編碼文本。這裏是一個剪輯在Python 2.7中打開URL時返回的亂碼文本

á¬ôŸ?ÍøäÅ€ˆËç?bçÞIË 
¡ëf)j´ñ‚TF8¯KÚpr®´Ö©iUizEÚD +¦¯÷tgNÈÑ.G¾LPUç?Ñ‘Ù~]ŒäÖÂ9Ÿð1£µ$JNóa?Z&Ÿtž'³Ðà#Í°¬õÅj5ŸE÷*æJî」Ï>íÓé’çÔqQI’†ksS™¾þEíqÝýly 

我的程序打開一個URL如下。我做什麼特別錯誤?

''' Opens a URL and returns the result ''' 
def open_url(query): 
    request = urllib2.Request(query) 
    response = urllib2.urlopen(request) 
    text = response.read() 
    #results = json.loads(text) 
    print text 


title = openRawResource, AssetManager.AssetInputStream throws IOException on read of larger files 


page1_query = stackoverflow_search_endpoint % (1,urllib.quote_plus(title),access_token,key) 

[0] https://api.stackexchange.com/2.1/search/advanced?page=1&pagesize=100&order=desc&sort=relevance&q=openRawResource%2C+AssetManager.AssetInputStream+throws+IOException+on+read+of+larger+files&site=stackoverflow&access_token= ****** &鍵= ******

[1] https://api.stackexchange.com/docs

[2] http://hastebin.com/qoxaxahaxa.sm

Soultion

我找到了解決方案。以下是你如何做到這一點。因爲它太huge.Many感謝埃弗特和Kristaps您指出有關減壓和請求設置頭

request = urllib2.Request(query) 
request.add_header('Accept-encoding', 'gzip') 
response = urllib2.urlopen(request) 
if response.info().get('Content-Encoding') == 'gzip': 
    buf = StringIO(response.read()) 
    f = gzip.GzipFile(fileobj=buf) 
    data = f.read() 
    result = json.loads(data) 

不能發佈完整的輸出。另外,還有一個類似的問題需要研究[3]。

[3] Does python urllib2 automatically uncompress gzip data fetched from webpage?

+0

您是否在完整程序中設置了任何請求標頭? – kristaps

+0

@kristaps不 - 我相信我應該但我不太瞭解這個程序。你能幫我嗎? – Dexter

+1

除了設置標題之外,你也應該檢查你回來的標題信息。請參閱urllib2文檔。例如,'response.info()'有一些元數據,包括標題信息。您可以使用'request.add_header()'在Request()對象上設置標題信息。請參閱http:// docs底部的示例。python.org/library/urllib2.html。 – Evert

回答

1

我找到了解決方案。以下是你如何做到這一點。因爲它太huge.Many感謝埃弗特和Kristaps您指出有關減壓和請求設置頭

request = urllib2.Request(query) 
request.add_header('Accept-encoding', 'gzip') 
response = urllib2.urlopen(request) 
if response.info().get('Content-Encoding') == 'gzip': 
    buf = StringIO(response.read()) 
    f = gzip.GzipFile(fileobj=buf) 
    data = f.read() 
    result = json.loads(data) 

不能發佈完整的輸出。另外,還有一個類似的問題需要研究[1]。

[1] Does python urllib2 automatically uncompress gzip data fetched from webpage?

2

文檔的下段表示:

另外,所有的API響應被壓縮。內容編碼 標題始終設置,但一些代理將刪除它。解碼API響應的正確方法可以在here找到。

您的輸出確實看起來像它可能被壓縮。瀏覽器會自動解壓縮數據(取決於內容編碼),因此您需要查看標題並執行相同的操作:results = json.loads(zlib.decompress(text))或類似的東西。

檢查here鏈接也是如此。

+0

感謝您的回覆。 t看起來像我需要添加一些頭到原始的API調用。 zlib.compress不直接工作,並引發「錯誤的頭檢查」錯誤。我不是這裏的專家。任何幫助實現我的目標應該是偉大的!謝謝。 – Dexter

+0

我認爲你的意思是'zlib.decompress'。之前可能會有一些額外的信息;你能顯示前幾行還是100個字符,以便你回來嗎? – Evert

+0

我沒有使用zlib.decompress。我無法在這裏粘貼這些字符。 – Dexter