2012-11-04 72 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''。 –