Python:Urllib.urlopen非数字端口

Python:Urllib.urlopen非数字端口,python,urllib,urlopen,Python,Urllib,Urlopen,对于以下代码 theurl = "https://%s:%s@members.dyndns.org/nic/update?hostname=%s&myip=%s&wildcard=NOCHG&mx=NOCHG&backmx=NOCHG" % (username, password, hostname, theip) conn = urlopen(theurl) # send the request to the url print(conn.read()) #

对于以下代码

theurl = "https://%s:%s@members.dyndns.org/nic/update?hostname=%s&myip=%s&wildcard=NOCHG&mx=NOCHG&backmx=NOCHG" % (username, password, hostname, theip)

conn = urlopen(theurl) # send the request to the url
print(conn.read())  # read the response
conn.close()   # close the connection
我得到以下错误

File "c:\Python31\lib\http\client.py", line 667, in _set_hostport
    raise InvalidURL("nonnumeric port: '%s'" % host[i+1:])

有什么想法吗?

错误消息显示您正在准备的url存在一些问题。打印并检查这是否是有效的url。

假定HTTP url中的“:”位于端口号之前。您放置的帐户名不是数字。它必须是一个整数端口值。

我同意muckabout,这就是问题所在。 您可能已经习惯在浏览器中使用此选项,这将导致浏览器通过主机验证。您可能应该在第一个@符号之前删除所有内容


请看一看,特别是FancyURLOpener,它可能会解决您的身份验证问题。

您可能需要对密码进行url编码。如果密码恰好包含“/”,您将看到类似的错误

下面是一个本地示例(实际值已编辑):


您可以使用
urllib.quote('somepass/a',safe='')
进行编码。

此外,您应该查看他们是否有基于web的API,您可以通过编程方式使用。这是不正确的。有三个地方“:”很重要。在协议之后、用户名之后和域之后。在第三位,它位于端口号之前。在第二个位置(这里使用的)它位于密码之前。为什么要打印它?他把它贴在问题上了。问题是muckabout提到的URL中的
。这是正确的答案-我愚蠢地没有逃避我的
/
字符,因此添加
safe='
对我有效,TY:)
>>> opener
<urllib.FancyURLopener instance at 0xb6f0e2ac>
>>> opener.open('http://admin:somepass@example.com')
<addinfourl at 3068618924L whose fp = <socket._fileobject object at 0xb6e7596c>>
>>> opener.open('http://admin:somepass/a@example.com')
*** InvalidURL: nonnumeric port: 'somepass'
>>> opener.open('http://admin:somepass%2Fa@example.com')