Python urllib2.urlopen 处理URL中的@符号

0 投票
2 回答
1170 浏览
提问于 2025-04-18 05:44

我在玩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()!

撰写回答