2012-11-04 64 views
1

我試圖使用urllib2.urlopen(實際上,我正在使用mechanize,但這是mechanize調用的方法)獲取頁面當我獲取頁面時,我收到的不完整響應;該頁面被截斷。但是,如果我訪問該頁面的非HTTPS版本,則會顯示完整頁面。Urllib2 HTTPS截斷響應

我在Arch Linux上(3.5.4-1-ARCH x86_64)。我正在運行openssl 1.0.1c。這個問題發生在我自己的另一臺Arch Linux機器上,但是在使用Python 3時(3.3.0)沒有。

此問題似乎與urllib2 not retrieving entire HTTP response有關。

我在唯一能讓我使用urllib2(Py I/O)的在線Python解釋器上測試它,它按預期工作。這裏是代碼:

import urllib2 

u = urllib2.urlopen('https://wa151.avayalive.com/WAAdminPanel/login.aspx?ReturnUrl=%2fWAAdminPanel%2fprivate%2fHome.aspx') 

print u.read()[-100:] 

最後一行應該包含通常的</body></html>

當我嘗試在我的機器urllib.urlretrieve,我得到:

ContentTooShortError: retrieval incomplete: got only 11365 out of 13805 bytes 

我不能在網上解釋測試urlretrieve,因爲它不會讓用戶寫入臨時文件。晚上晚些時候,我會嘗試從我的機​​器上獲取URL,但是從其他位置獲取。

回答

5

我得到了同樣的錯誤,使用Python 2.7,不同的Linux系統上:

>>> urllib.urlretrieve('https://wa151.avayalive.com/WAAdminPanel/login.aspx?ReturnUrl=%2fWAAdminPanel%2fprivate%2fHome.aspx') 
--------------------------------------------------------------------------- 
ContentTooShortError      Traceback (most recent call last) 
... 
ContentTooShortError: retrieval incomplete: got only 11365 out of 13805 bytes 

然而,相同的操作可以完成(實際上對我的作品)使用requests

>>> import requests 
>>> r = requests.get('https://wa151.avayalive.com/WAAdminPanel/login.aspx?ReturnUrl=%2fWAAdminPanel%2fprivate%2fHome.aspx') 
>>> with open(somefilepath, 'w') as f: 
...  f.write(r.text) 

這是否適合您?

+0

我目前處於不同位置,urllib2.urlopen或urllib2.urlretrieve也不在這裏工作。 我安裝了'requests'模塊,它工作完美。 我會逐行比較'urlopen'和'requests'來定位失敗點。我仍然不知道應該責怪誰:包裝商,還是上游(Python開發者)。 – sleblanc

+0

感謝您的幫助,Balthazar! – sleblanc

+0

注意:在內部,「requests」是基於''urllib3''。 –