Почему происходит сбой urllib.request.urlretrieve, если в URL есть специальный символ («ä»)? - PullRequest
0 голосов
/ 07 октября 2019

Я хочу сохранить изображение из reddit в локальный файл:

import urllib.request
urllib.request.urlretrieve(post.url, "local-filename.jpg")

Для воспроизведения просто замените post.url URL-адресом, содержащим «ä»

Но я наткнулся наоднажды произошла ошибка: в заголовке публикации Reddit в заголовке была буква «ä».

Я понимаю, что это связано с основной проблемой Unicode в Python, и я прочитал UnicodeEncodeError: 'ascii' codecне могу закодировать символ u '\ xa0' в позиции 20: порядковый номер не в диапазоне (128) , но я не понимаю, как применить исправление к моей проблеме.

Это ошибка, которую яполучил:

https://www.reddit.com/r/OkBrudiMongo/comments/cogkye/hä_was_ist_los_petersans/ Hä, was ist los Peter-Sans?!
Traceback (most recent call last):
  File "C:/Users/Administrator/Documents/DefaultProject/Main.py", line 55, in <module>
    Mainbot()
  File "C:/Users/Administrator/Documents/DefaultProject/Main.py", line 48, in Mainbot
    Mainbot()
  File "C:/Users/Administrator/Documents/DefaultProject/Main.py", line 38, in Mainbot
    urllib.request.urlretrieve(post.url, "local-filename.jpg")
  File "C:\Program Files\Python37\lib\urllib\request.py", line 247, in urlretrieve
    with contextlib.closing(urlopen(url, data)) as fp:
  File "C:\Program Files\Python37\lib\urllib\request.py", line 222, in urlopen
    return opener.open(url, data, timeout)
  File "C:\Program Files\Python37\lib\urllib\request.py", line 525, in open
    response = self._open(req, data)
  File "C:\Program Files\Python37\lib\urllib\request.py", line 543, in _open
    '_open', req)
  File "C:\Program Files\Python37\lib\urllib\request.py", line 503, in _call_chain
    result = func(*args)
  File "C:\Program Files\Python37\lib\urllib\request.py", line 1360, in https_open
    context=self._context, check_hostname=self._check_hostname)
  File "C:\Program Files\Python37\lib\urllib\request.py", line 1317, in do_open
    encode_chunked=req.has_header('Transfer-encoding'))
  File "C:\Program Files\Python37\lib\http\client.py", line 1229, in request
    self._send_request(method, url, body, headers, encode_chunked)
  File "C:\Program Files\Python37\lib\http\client.py", line 1240, in _send_request
    self.putrequest(method, url, **skips)
  File "C:\Program Files\Python37\lib\http\client.py", line 1107, in putrequest
    self._output(request.encode('ascii'))
UnicodeEncodeError: 'ascii' codec can't encode character '\xe4' in position 37: ordinal not in range(128)
...