UnicodeDecodeError: кодек utf-8 не может декодировать байт 0xff в позиции 0: недопустимый начальный байт при попытке кодирования ('utf-8')

Когда я пытался использовать .encode('utf-8'), выходит "UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte".

Я пытался сканировать некоторые изображения, и меня смутила одна проблема. Я использовал urllib.request.urlopen(url).read().decode('utf-8') для преобразования html-страницы для получения URL-адреса изображения. Позже я хочу их сохранить.

Однако я поместил все коды о urlopen в функцию, поэтому не хочу их менять. Тогда я подумал, может быть, я могу использовать encode('utf-8'), чтобы преобразовать их обратно. После этого я не знаю, почему, но возникло исключение.

import urllib.request as ur
import os

def getresponse(url):
    head = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36'}
    req = ur.Request(url, None, head)
    response = ur.urlopen(req)
    result = response.read().decode('utf-8')
    return result


def saveimg(urlimg):
    img = getresponse(urlimg).encode('utf-8')
    file = open('xx.jpg', 'wb')
    file.write(img)
    file.close()


def downloadimg(url):
    os.chdir('/Users/xxxxxxx/Desktop')
    os.mkdir('xx')
    os.chdir('xx')
    saveimg(url)

downloadimg('https://cn.bing.com/th?id=OHR.WaterperryGardens_ZH-CN5767279278_1920x1080.jpg&rf=LaDigue_1920x1080.jpg&pid=hp')

Я просто хочу знать причину этого.

почему бы вам не использовать requests вместо этого?

Ivan Vinogradov 14.07.2019 14:05

Ээээ, я не знаю, как им пользоваться. Не могли бы вы вкратце рассказать, чем он лучше urllib.request? Я видел, что кто-то использовал его раньше, но я не знаю, в чем разница между urllib.request и request. Спасибо.

JJDon 16.07.2019 12:52

Взгляните на мой ответ

Ivan Vinogradov 16.07.2019 14:16
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
3
1 082
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Могу ли я предложить решение с requests?

import os
import requests  # pip install requests

def download(url, headers, dest_folder, new_file_name):
    if not os.path.exists(dest_folder):
        os.makedirs(dest_folder)  # create folder if it does not exist

    filename = new_file_name.replace(" ", "_")  # be careful with file names
    file_path = os.path.join(dest_folder, filename)

    r = requests.get(url, headers=headers, stream=True)
    if r.ok:
        print("saving to", os.path.abspath(file_path))
        with open(file_path, 'wb') as f:
            for chunk in r.iter_content(chunk_size=1024 * 8):
                if chunk:
                    f.write(chunk)
                    f.flush()
                    os.fsync(f.fileno())
    else:  # HTTP status code 4XX/5XX
        print("Download failed: status code {}\n{}".format(r.status_code, r.text))


headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36'}
url = 'https://cn.bing.com/th?id=OHR.WaterperryGardens_ZH-CN5767279278_1920x1080.jpg&rf=LaDigue_1920x1080.jpg&pid=hp'
dest_folder = '/Users/xxxxxxx/Desktop/yyyy'
new_file_name = 'xx.jpg'

# save file to /Users/xxxxxxx/Desktop/yyyy/xx.jpg
# appropriate folders will be created if they do not exist
download(url, headers, dest_folder, new_file_name)

Другие вопросы по теме