2010-07-28 19 views
6

以下代碼的Python:非數字了urllib.urlopen端口

theurl = "https://%s:%[email protected]/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:]) 

任何想法?

回答

0

錯誤消息顯示您正在準備的網址存在一些問題。打印並檢查這是否是有效的網址。

+0

爲什麼要打印它?他在問題中發佈了它。問題是muckabout提到的URL中的':'。 – 2010-07-28 09:14:22

0

假定HTTP URL中的':'在端口號之前。您正在放置一個不是數字的帳戶名稱。它必須是一個整數端口值。

+0

另外,你應該看看他們是否有一個基於web的API,你可以通過編程來使用它。 – 2010-07-28 09:09:58

+10

這是不正確的。 「:」有三個重要的地方。協議後,用戶名後,域後。第三位在端口號前面。其次(如這裏使用的)它在密碼之前。 – 2011-10-21 10:52:04

1

我同意muckabout,這是問題。 你可能習慣在瀏覽器中使用它,這會導致瀏覽器與主機進行身份驗證。您應該放棄第一個@符號前的所有內容。

查看urllib docs,特別是FancyURLOpener,它可以解決您的身份驗證問題。

6

您可能需要對密碼進行網址編碼。如果密碼恰好包含'/',您會看到類似的錯誤。

這裏有一個本地的例子(節錄實際值):

>>> opener 
<urllib.FancyURLopener instance at 0xb6f0e2ac> 
>>> opener.open('http://admin:[email protected]') 
<addinfourl at 3068618924L whose fp = <socket._fileobject object at 0xb6e7596c>> 
>>> opener.open('http://admin:somepass/[email protected]') 
*** InvalidURL: nonnumeric port: 'somepass' 

編碼的密碼:

>>> opener.open('http://admin:somepass%[email protected]') 

您可以使用urllib.quote('somepass/a', safe='')做編碼。

+0

這是正確的答案 - 我愚蠢地沒有逃過我的'/'字符,所以加入'safe ='''爲我工作,T​​Y :) – 2014-04-09 10:15:03