2010-07-28 4 views
6

per il seguente codicePython: urllib.urlopen porta non numerico

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 

ottengo il seguente errore

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

Delle idee ???

risposta

0

Il messaggio di errore indica che c'è qualche problema con l'url che state preparando. Stampa e controlla se questo è un URL valido.

+0

Perché stamparlo? L'ha pubblicato nella domanda. Il problema è ":" nell'URL menzionato da Muckabout. –

0

Si presume che ':' nell'URL HTTP preceda un numero di porta. Stai inserendo un nome account che non è numerico. Deve essere un valore di porta intero.

+0

Inoltre, dovresti vedere se hanno un'API web che puoi usare a livello di programmazione. –

+10

Questo non è corretto. Esistono tre luoghi in cui ':' sono significativi. Dopo il protocollo, dopo il nome utente e dopo il dominio. Al terzo posto precede il numero di porta. In secondo luogo (come usato qui) precede la password. –

1

Sono d'accordo con la melma, questo è il problema. Probabilmente sei abituato a utilizzarlo in un browser, il che farebbe autenticare il browser con l'host. Probabilmente dovresti abbandonare tutto prima del primo segno @.

dai un'occhiata a urllib docs, in particolare FancyURLOpener che potrebbe risolvere il tuo problema con l'autenticazione.

6

Probabilmente hai bisogno di url-codificare la password. Vedrai un errore del genere se la password dovesse contenere un '/'.

Ecco un esempio locale (valori reali redatte):

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

Encode la password:

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

È possibile utilizzare urllib.quote('somepass/a', safe='') per fare la codifica.

+0

Questa è la risposta giusta - Non ho follemente sfuggito al mio carattere '/', quindi l'aggiunta di 'safe = ''' ha funzionato per me, TY :) –