2010-07-28 10 views
6

für den folgenden CodePython: Urllib.urlopen nicht numerisch Port

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 

bekomme ich folgende Fehler

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

Irgendwelche Ideen ???

Antwort

0

Die Fehlermeldung zeigt an, dass ein Problem mit der URL besteht, die Sie vorbereiten. Drucken Sie und prüfen Sie, ob es sich um eine gültige URL handelt.

+0

Warum drucken? Er hat es in der Frage gepostet. Das Problem ist das ':' in der URL, die muckabout erwähnt hat. –

0

Das ':' in der HTTP-URL wird als einer Portnummer vorangestellt angenommen. Sie geben einen Kontonamen ein, der nicht numerisch ist. Es muss ein ganzzahliger Portwert sein.

+0

Darüber hinaus sollten Sie sehen, ob sie über eine webbasierte API verfügen, die Sie programmgesteuert verwenden können. –

+10

Das ist falsch. Es gibt drei Stellen, an denen ":" signifikant sind. Nach dem Protokoll, nach dem Benutzernamen und nach der Domäne. An dritter Stelle geht es der Portnummer voraus. An zweiter Stelle (wie hier verwendet) geht es dem Passwort voraus. –

1

Ich stimme mit muckabout überein, das ist das Problem. Sie sind wahrscheinlich daran gewöhnt, dies in einem Browser zu verwenden, was dazu führen würde, dass sich der Browser mit dem Host authentifiziert. Sie sollten wahrscheinlich alles vor dem ersten @ Zeichen fallen lassen.

werfen Sie einen Blick auf urllib docs, speziell FancyURLOpener, die Ihr Problem mit der Authentifizierung lösen könnte.

6

Wahrscheinlich müssen Sie das Kennwort url-encodieren. Sie werden einen solchen Fehler sehen, wenn das Passwort ein '/' enthält.

Hier ist ein lokales Beispiel (Istwerten geschwärzt):

>>> 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 das Passwort:

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

Sie können urllib.quote('somepass/a', safe='') verwenden, um die Codierung zu tun.

+0

Das ist die richtige Antwort - ich bin törichterweise meinem '/' Charakter nicht entkommen, also hat das Hinzufügen von 'safe = ''' für mich funktioniert, TY :) –