Python urllib2.urlopen 处理URL中的@符号
我在玩Python,想用一个网址,长这样:
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 个回答
1
URI(统一资源标识符)中有一些特殊的字符,用来分隔URI的不同部分,比如 /
、?
、&
、@
以及其他一些字符。如果这些字符出现在用户名(在你的情况下是 @
)或密码中,就需要进行百分号编码,否则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'
另外,别把用户名和密码放在方括号里,这样也是不合法的。
0
使用urlencode!我不太确定urllib2里有没有这个功能,但urllib里有一个urlencode的函数。等我一下,我马上就回来。
我快速查了一下,看来你需要用urllib而不是urllib2来实现这个功能……先导入urllib,然后用urllib.urlencode(你的网址)就可以了!
import urllib
url = urllib.urlencode(<your_url_here>)
补充:其实是urlllib2.quote()!