【问题标题】:Urllib2 HTTPS truncated responseUrllib2 HTTPS 截断响应
【发布时间】:2012-10-24 17:08:45
【问题描述】:

我正在尝试使用urllib2.urlopen 获取页面(实际上,我使用的是mechanize,但这是mechanize 调用的方法)当我获取页面时,我得到的响应不完整;页面被截断。但是,如果我访问页面的非 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,但来自不同的位置。

【问题讨论】:

    标签: python https urllib2 urlopen


    【解决方案1】:

    我在不同的 Linux 系统上使用 Python 2.7 时遇到了同样的错误:

    >>> 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)
    

    这对你有用吗?

    【讨论】:

    • 我目前在不同的位置,urllib2.urlopenurllib2.urlretrieve 也不在这里工作。我安装了requests 模块,它运行良好。我将逐行比较urlopenrequests 以定位故障点。我仍然不知道该怪谁:打包者,还是上游(Python 开发者)。
    • 感谢您的帮助,巴尔萨扎!
    • 注意:在内部,requests 基于urllib3
    猜你喜欢
    • 2015-04-27
    • 2013-03-02
    • 2014-05-15
    • 1970-01-01
    • 1970-01-01
    • 2019-04-24
    • 1970-01-01
    • 1970-01-01
    • 2010-09-17
    相关资源
    最近更新 更多