Wie eine Datei über HTTP mit Genehmigung in Python 3.0 arbeiten, um Fehler downloaden?

StackOverflow https://stackoverflow.com/questions/395451

  •  23-08-2019
  •  | 
  •  

Frage

Ich habe ein Skript, das Ich mag würde weiter benutzen, aber es sieht aus wie entweder ich habe einige Abhilfe für einen Fehler in Python 3 oder Herabstufung wieder auf 2,6, zu finden und damit auch andere Skripte degradieren muß. ..

Hoffentlich jemand hier bereits geschaffen, eine Abhilfe zu finden.

Das Problem ist, dass aufgrund der neuen Änderungen in Python 3.0 in Bezug auf Bytes und Strings, die nicht alle die Bibliothek Code wird offenbar getestet.

Ich habe ein Skript, das eine Seite von einem Webserver downloades. Dieses Skript übergeben einen Benutzernamen und ein Passwort als Teil der URL in Python 2.6, aber in Python 3.0, das funktioniert nicht mehr.

Zum Beispiel dieses:

import urllib.request;
url = "http://username:password@server/file";
urllib.request.urlretrieve(url, "temp.dat");

nicht mit dieser Ausnahme:

Traceback (most recent call last):
  File "C:\Temp\test.py", line 5, in <module>
    urllib.request.urlretrieve(url, "test.html");
  File "C:\Python30\lib\urllib\request.py", line 134, in urlretrieve
    return _urlopener.retrieve(url, filename, reporthook, data)
  File "C:\Python30\lib\urllib\request.py", line 1476, in retrieve
    fp = self.open(url, data)
  File "C:\Python30\lib\urllib\request.py", line 1444, in open
    return getattr(self, name)(url)
  File "C:\Python30\lib\urllib\request.py", line 1618, in open_http
    return self._open_generic_http(http.client.HTTPConnection, url, data)
  File "C:\Python30\lib\urllib\request.py", line 1576, in _open_generic_http
    auth = base64.b64encode(user_passwd).strip()
  File "C:\Python30\lib\base64.py", line 56, in b64encode
    raise TypeError("expected bytes, not %s" % s.__class__.__name__)
TypeError: expected bytes, not str

Offenbar Base64-Codierung muss nun Bytes in und gibt einen String und damit urlretrieve (oder ein Code darin), die eine Reihe von Benutzernamen aufbaut: Passwort und versucht, base64 kodieren diese für einfache Genehmigung versagt <. / p>

Wenn ich stattdessen versuchen urlopen zu verwenden, wie folgt aus:

import urllib.request;
url = "http://username:password@server/file";
f = urllib.request.urlopen(url);
contents = f.read();

Dann schlägt es mit dieser Ausnahme:

Traceback (most recent call last):
  File "C:\Temp\test.py", line 5, in <module>
    f = urllib.request.urlopen(url);
  File "C:\Python30\lib\urllib\request.py", line 122, in urlopen
    return _opener.open(url, data, timeout)
  File "C:\Python30\lib\urllib\request.py", line 359, in open
    response = self._open(req, data)
  File "C:\Python30\lib\urllib\request.py", line 377, in _open
    '_open', req)
  File "C:\Python30\lib\urllib\request.py", line 337, in _call_chain
    result = func(*args)
  File "C:\Python30\lib\urllib\request.py", line 1082, in http_open
    return self.do_open(http.client.HTTPConnection, req)
  File "C:\Python30\lib\urllib\request.py", line 1051, in do_open
    h = http_class(host, timeout=req.timeout) # will parse host:port
  File "C:\Python30\lib\http\client.py", line 620, in __init__
    self._set_hostport(host, port)
  File "C:\Python30\lib\http\client.py", line 632, in _set_hostport
    raise InvalidURL("nonnumeric port: '%s'" % host[i+1:])
http.client.InvalidURL: nonnumeric port: 'password@server'

Offenbar die URL in dieser „Next-Gen-URL abrufen Bibliothek“ Parsen nicht weiß, was mit Benutzernamen und Passwörter in der URL zu tun.

Welche anderen Möglichkeiten habe ich?

War es hilfreich?

Lösung

Direkt vom Py3k docs: http: // docs. python.org/dev/py3k/library/urllib.request.html#examples

import urllib.request
# Create an OpenerDirector with support for Basic HTTP Authentication...
auth_handler = urllib.request.HTTPBasicAuthHandler()
auth_handler.add_password(realm='PDQ Application',
                          uri='https://mahler:8092/site-updates.py',
                          user='klem',
                          passwd='kadidd!ehopper')
opener = urllib.request.build_opener(auth_handler)
# ...and install it globally so it can be used with urlopen.
urllib.request.install_opener(opener)
urllib.request.urlopen('http://www.example.com/login.html')

Andere Tipps

Mein Rat wäre, zu Ihrem 2. * Zweig als Produktionszweig zu halten, bis Sie die 3,0 Sachen sortiert bekommen kann.

Ich werde eine Weile warten, bevor 3,0 bis Python bewegend über. Es scheint eine Menge Leute in Eile, aber ich will einfach alles aussortiert, und eine gute Auswahl an Bibliotheken von Drittanbietern. Dies kann ein Jahr dauern, dauert es 18 Monate dauern kann, aber der Druck auf „Upgrade“ ist wirklich niedrig für mich.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top