我想打開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)
[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?
您是否在完整程序中設置了任何請求標頭? – kristaps
@kristaps不 - 我相信我應該但我不太瞭解這個程序。你能幫我嗎? – Dexter
除了設置標題之外,你也應該檢查你回來的標題信息。請參閱urllib2文檔。例如,'response.info()'有一些元數據,包括標題信息。您可以使用'request.add_header(,)'在Request()對象上設置標題信息。請參閱http:// docs底部的示例。python.org/library/urllib2.html。 –
Evert