python 3 urllib和http.client - 无法打开调试消息

时间:2017-03-18 16:01:44

标签: python python-3.x debugging urllib

您好Stackoverflow社区,

我正在尝试熟悉urllib.request标准库,并在我的脚本中使用它而不是wget。 然而,我无法在IDLE中显示详细的HTTP消息,也不能使用脚本文件或手动将命令键入cmd(py)。

我在Windows 7 x64上使用Python,尝试3.5和3.6包括3.6.1rc1但没有成功。

假设使用此命令打开消息:

http.client.HTTPConnection.debuglevel = 1

所以这是我的示例代码。它有效但没有显示细节:

import http.client
import urllib.request
http.client.HTTPConnection.debuglevel = 1
response = urllib.request.urlopen('http://stackoverflow.com')
content = response.read()
with open("stack.html", "wb") as file:
    file.write(content)

我尝试过使用.set_debuglevel(1)但没有成功。 这里似乎有几年的问题 Turning on debug output for python 3 urllib 然而,这和我一样,而且不起作用。另外在这个问题的评论用户 Yen Chi Hsuan 说这是一个错误并在此报告 https://bugs.python.org/issue26892

该漏洞已于2016年6月关闭,因此我希望在最近的Python版本中对此进行更正。

也许我错过了某些东西(比如需要启用/安装其他东西等等)但是我花了一些时间在这上面并走到了尽头。

是否有一种工作方式可以在Windows上的Python 3上使用urllib显示http详细消息?

谢谢

编辑: pvg 建议的响应适用于简单示例,但我无法在需要登录的情况下使其工作。 HTTPBasicAuthHandler没有此debuglevel属性。当我尝试将多个处理程序组合到开启器中时,它也不起作用。

userName = 'mylogin'
passWord  = 'mypassword'
top_level_url = 'http://page-to-login.com'

# create an authorization handler
passman = urllib.request.HTTPPasswordMgrWithDefaultRealm()
passman.add_password(None, top_level_url, userName, passWord);

auth_handler = urllib.request.HTTPBasicAuthHandler(passman)
opener = urllib.request.build_opener(auth_handler)
urllib.request.install_opener(opener)

result = opener.open(top_level_url)
content = result.read()

1 个答案:

答案 0 :(得分:0)

您链接的问题中的示例显示了工作代码,下面转载的版本:

ifstream::clear()

这非常笨重,另一个选择是使用更友好的库,如urllib3(http://urllib3.readthedocs.io/en/latest/)。

import urllib.request

handler = urllib.request.HTTPHandler(debuglevel=10)
opener = urllib.request.build_opener(handler)
content = opener.open('http://stackoverflow.com').read()

print(content[0:120])

如果您决定使用请求库,则以下答案描述了如何设置日志记录:

How can I see the entire HTTP request that's being sent by my Python application?