2013-11-14 50 views
1

嗨我試圖從這個URL(http://www.sicom.gov.co/precios/controller?accion=ExportToExcel)下載一個excel文件,然後我需要使用xlrd來解析它。無法使用urllib2下載整個文件

問題是,當我把Url放到瀏覽器上時,我得到的是一個大概2MB的excel文件,但是當我使用urllib2,http2lib下載文件或者從命令行卷曲時,我只能得到一個4k文件,很明顯,解析不完整的文件失敗了。

奇怪的是,xlrd似乎能夠從下載的文件中讀取正確的表名,所以我猜這個文件是正確的,但它顯然是不完整的。

這裏是我想要達到

import urllib2 
from xlrd import open_workbook 

excel_url = 'http://www.sicom.gov.co/precios/controller?accion=ExportToExcel' 

result = urllib2.urlopen(excel_url) 
wb = open_workbook(file_contents=result.read()) 
response = "" 
for s in wb.sheets(): 
      response += 'Sheet:' + s.name + '<br>' 
      for row in range(s.nrows): 
       values = [] 
       for col in range(s.ncols): 
        value = s.cell(row, col).value 
        if (value): 
         values.append(str(value) + " not empty") 
        else: 
         values.append("Value at " + col + ", " + row + " was empty") 
       response += str(values) + "<br>" 
+2

如果我將該鏈接粘貼到我的瀏覽器中,我只會得到一個名爲'controller'的文件,它是4.1KB。 – jramirez

+0

@jucas你可能在這臺服務器上有一個會話,它向你發送一個不同於我們的文件。 – 2013-11-14 19:56:33

+0

您可能必須登錄網站才能訪問該文件嗎?這就是爲什麼你無法從你的腳本中獲取它的原因。 – jramirez

回答

2

你必須先打電話給你的第一個網址的一些示例代碼。它似乎設置了一個cookie或類似的東西。然後調用第二個下載excel文件。對於那種工作,你應該更喜歡http://docs.python-requests.org/en/latest/#,因爲它比標準的lib工具更容易使用,並且它默認情況下更好地處理特殊情況(如cookies)。

import requests 

s = requests.Session() 
s.get('http://www.sicom.gov.co/precios/controller?accion=Home&option=SEARCH_PRECE') 
response = s.get('http://www.sicom.gov.co/precios/controller?accion=ExportToExcel') 

with file('out.xls','wb') as f: 
    f.write(response.content) 
+0

偉大的解決方案! –