У меня сейчас похожий случай. Я пытаюсь загрузить изображения. Я получаю URL-адреса с сервера в файле JSON. Некоторые изображения содержат символы не ASCII. Это выдает ошибку:
for image in product["images"]:
filename = os.path.basename(image)
filepath = product_path + "/" + filename
urllib.request.urlretrieve(image, filepath) # error!
UnicodeEncodeError: кодек 'ascii' не может кодировать символ '\ xc7' в позиции ...
Я пытался использовать .encode("UTF-8")
, но не могу сказать, что это помогло:
# coding=UTF-8
import urllib
url = u"http://example.com/wp-content/uploads/2018/09/İMAGE-1.png"
url = url.encode("UTF-8")
urllib.request.urlretrieve(url, "D:\image-1.jpg")
Это просто выдает еще одну ошибку:
TypeError: нельзя использовать строковый шаблон для байтовоподобного объекта
Тогда я дал urllib.parse.quote(url)
идти:
import urllib
url = "http://example.com/wp-content/uploads/2018/09/İMAGE-1.png"
url = urllib.parse.quote(url)
urllib.request.urlretrieve(url, "D:\image-1.jpg")
и снова выдается еще одна ошибка:
ValueError: неизвестный тип URL: 'http% 3A // example.com / wp-content / uploads / 2018/09 /% C4% B0MAGE-1.png'
:
в "http://..."
также сбежал, и я думаю, что это является причиной проблемы.
Итак, я нашел обходной путь. Я просто цитирую / избегаю пути, а не весь URL.
import urllib.request
import urllib.parse
url = "http://example.com/wp-content/uploads/2018/09/İMAGE-1.png"
url = urllib.parse.urlparse(url)
url = url.scheme + "://" + url.netloc + urllib.parse.quote(url.path)
urllib.request.urlretrieve(url, "D:\image-1.jpg")
Вот как выглядит URL: "http://example.com/wp-content/uploads/2018/09/%C4%B0MAGE-1.png"
, и теперь я могу загрузить изображение.