在URL中使用@符号的Python urllib2.urlopen

时间:2014-05-07 21:43:34

标签: python urllib2

我正在玩Python并且有一个我正在尝试使用的URL,就像这样

https://[username@domain.com]:[password]@domain.com/blah

这是我的代码:

response =urllib2.urlopen("https://[username@domain.com]:[password]@domain.com/blah")
html = response.read()
print ("data="+html)

这不是经过,它不喜欢@符号,也可能是:也是。我试着搜索,然后读了一些关于unquote的内容,但那没有做任何事情。这是我得到的错误:

 raise InvalidURL("nonnumeric port: '%s'" % host[i+1:])
httplib.InvalidURL: nonnumeric port: 'password@updates.opendns.com'

我如何解决这个问题?实际网站为“https://updates.opendns.com/nic/update?hostname=

谢谢你!

2 个答案:

答案 0 :(得分:1)

URI有一堆保留字符,分隔URI的可区分部分(/?&@few others)。如果这些字符中的任何一个出现在用户名(在您的情况下为@)或密码中,则它们需要进行百分比编码或URI变为无效。

在Python 3中:

>>> from urllib import parse
>>> parse.quote("p@ssword?")
'p%40ssword%3F'

在Python 2中:

>>> import urllib
>>> urllib.quote("p@ssword?")
'p%40ssword%3F'

另外,请勿将用户名和密码放在方括号中,这也无效。

答案 1 :(得分:0)

使用urlencode!不确定urllib2是否有它,但是urllib有一个urlencode函数。一秒钟,我会回复你。

我做了一个快速检查,似乎你需要使用urrlib而不是urllib2 ...导入urllib然后使用urllib.urlencode(你的URL)应该可以工作!

import urllib
url = urllib.urlencode(<your_url_here>)
编辑:它实际上是urlllib2.quote()!