2010-07-28 7 views
6

na poniższym kodziePython: urllib.urlopen nieliczbowa portu

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 

pojawia się następujący błąd

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

Wszelkie pomysły ???

Odpowiedz

0

Komunikat o błędzie pokazuje, że jest problem z przygotowywanym adresem URL. Wydrukuj i sprawdź, czy jest to prawidłowy adres URL.

+0

Dlaczego warto go wydrukować? Umieścił to w pytaniu. Problemem jest ":" w adresie URL, o którym wspomniał muckabout. –

0

"Dom" w adresie URL HTTP ma poprzedzać numer portu. Umieszczasz nazwę konta, która nie jest numeryczna. Musi to być wartość portu całkowitego.

+0

Ponadto powinieneś sprawdzić, czy mają interfejs API oparty na sieci WWW, który możesz użyć programowo. –

+10

To jest nieprawidłowe. Istnieją trzy miejsca, w których ":" są znaczące. Po protokole, po nazwie użytkownika i po domenie. Na trzecim miejscu poprzedza numer portu. Na drugim miejscu (w tym miejscu) poprzedza hasło. –

1

Zgadzam się z muckabout, to jest problem. Prawdopodobnie używasz tego w przeglądarce, co spowoduje, że przeglądarka będzie uwierzytelniać się z hostem. Prawdopodobnie powinieneś upuścić wszystko przed pierwszym znakiem @.

spójrz na urllib docs, w szczególności FancyURLOpener, który może rozwiązać problem z uwierzytelnianiem.

6

Prawdopodobnie musisz zakodować kod pocztowy za pomocą hasła. Zobaczysz błąd podobny, jeśli hasło zawiera znak "/".

Oto przykład lokalny (wartości rzeczywiste redacted):

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

zakodować hasło:

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

Można użyć urllib.quote('somepass/a', safe='') zrobić kodowanie.

+0

To jest odpowiednia odpowiedź - Głupio nie uciekłem od mojej postaci '/', więc dodanie 'safe = '' pracowało dla mnie, TY :) –