2010-07-28 11 views
6

el siguiente códigoPython: urllib.urlopen puerto no numérico

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 

me sale el siguiente error

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

¿Ideas ???

Respuesta

0

El mensaje de error muestra que hay algún problema con la url que está preparando. Imprima y verifique si esta es una url válida.

+0

¿Por qué imprimirlo? Lo ha publicado en la pregunta. El problema es el ':' en la URL que ha mencionado muckabout. –

0

Se supone que ':' en la URL HTTP precede a un número de puerto. Está colocando un nombre de cuenta que no es numérico. Debe ser un valor de puerto entero.

+0

Además, debería ver si tienen una API basada en web que puede usar mediante programación. –

+10

Esto es incorrecto. Hay tres lugares en los que ':' son significativos. Después del protocolo, después del nombre de usuario y después del dominio. En tercer lugar, precede al número de puerto. En segundo lugar (como se usa aquí), precede a la contraseña. –

1

Estoy de acuerdo con muckabout, este es el problema. Probablemente esté acostumbrado a usar esto en un navegador, lo que haría que el navegador se autentique con el host. Probablemente deberías dejar todo antes del primer signo @.

eche un vistazo a urllib docs, específicamente FancyURLOpener, que podría resolver su problema con la autenticación.

6

Probablemente necesite codificar por URL la contraseña. Verás un error como ese si la contraseña contiene un '/'.

Aquí está un ejemplo local (valores reales redactados):

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

codificar la contraseña:

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

Puede utilizar urllib.quote('somepass/a', safe='') hacer la codificación.

+0

Esta es la respuesta correcta: tontamente no escapé de mi carácter '/', así que agregar 'safe = ''' funcionó para mí, TY :) –

Cuestiones relacionadas