Python 3.0의 승인을 통해 HTTP를 통해 파일을 다운로드하여 버그를 중심으로 작업하는 방법은 무엇입니까?

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

  •  23-08-2019
  •  | 
  •  

문제

계속 사용하고 싶은 스크립트가 있지만 Python 3에서 버그에 대한 해결 방법을 찾거나 2.6으로 다운 그레이드해야하므로 다른 스크립트를 다운 그레이드해야합니다 ...

바라건대 여기 누군가가 이미 해결 방법을 찾았기를 바랍니다.

문제는 바이트 및 문자열과 관련하여 Python 3.0의 새로운 변경으로 인해 모든 라이브러리 코드가 분명히 테스트되지는 않았다는 것입니다.

예를 들어, 이것은 다음과 같습니다.

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

이 예외로 실패합니다.

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

분명히, Base64- 인코딩은 이제 바이트를 바이트로 가져 와서 문자열을 출력해야하므로 Urlretrieve (또는 일부 코드)는 비밀번호를 구축하고 간단한 인증을 위해 Base64-encode를 시도합니다.

대신 Urlopen을 사용하려고하면 다음과 같이

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

그런 다음이 예외로 실패합니다.

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'

이 "Next Gen URL 검색 라이브러리"의 URL 파싱은 URL의 사용자 이름과 암호로 무엇을 해야하는지 모릅니다.

다른 선택은 무엇입니까?

도움이 되었습니까?

해결책

PY3K 문서에서 직접 : 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')

다른 팁

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top