Python:Urllib.urlopen非数字端口

6
以下是代码示例:
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:])

有什么想法吗?
4个回答

6

你可能需要对密码进行URL编码。如果密码中包含“/”,则会出现类似的错误。

这是一个本地示例(实际值已被删除):

>>> 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')

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

这是正确的答案 - 我愚蠢地没有转义我的 / 字符,所以添加 safe='' 对我有用,谢谢 :) - Ian Clark

1

我同意muckabout的观点,这就是问题所在。 你可能习惯于在浏览器中使用它,这会导致浏览器与主机进行身份验证。你应该删除第一个@符号之前的所有内容。

看一下urllib文档,特别是FancyURLOpener,它可能解决您身份验证的问题。


0
错误信息显示您正在准备的URL存在问题。请打印并检查它是否是一个有效的URL。

为什么要打印它?他已经在问题中发布了它。问题是URL中的“:”,正如muckabout所提到的那样。 - Noufal Ibrahim

0
HTTP URL 中的 ':' 被假定为端口号的前缀。您正在放置一个非数字的帐户名。它必须是整数端口值。

此外,您还应查看它们是否有可编程使用的基于Web的API。 - Noufal Ibrahim
10
这是不正确的。有三个位置是“:”符号的重要标志。协议后面,用户名后面和域名后面。在第三个位置,它位于端口号之前。在第二个位置(就像这里使用的那样),它位于密码之前。 - Jean Jordaan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接