Wie zum download einer Datei über http-Vollmacht, die in python 3.0, arbeiten rund um bugs?

Ich habe ein Skript, dass ich gerne weiterhin verwenden, aber es sieht wie ich aus, entweder haben einige workaround für einen bug in Python 3, - oder downgrade wieder auf 2,6, und somit ein downgrade andere scripts, sowie...

Ich hoffe, jemand hier haben es schon geschafft, einen workaround finden.

Das problem ist, dass aufgrund der neuen änderungen in Python 3.0 in Bezug auf bytes und strings, nicht alle der code der Bibliothek ist anscheinend getestet.

Ich habe ein Skript, dass downloades einer Seite von einem web-server. Dieses Skript übergeben werden Benutzername und Passwort als Teil der url in python 2.6, aber in Python 3.0 nicht mehr funktioniert.

Zum Beispiel dieses:

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

schlägt fehl, mit folgender 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

Anscheinend base64-Kodierung muss nun bytes und gibt eine Zeichenfolge, und damit urlretrieve (oder code darin) und baut ein string, der username:Passwort und versucht base64-Kodieren, das für die einfache Autorisierung fehlschlägt.

Wenn ich statt versuchen zu verwenden urlopen, wie diese:

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

Dann schlägt er 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'

Anscheinend der url-Analyse in diesem "next-gen-url-Abruf-Bibliothek", die nicht wissen, was zu tun ist mit Benutzername und Passwort in der url.

Welche anderen Möglichkeiten habe ich?

Schreibe einen Kommentar