Объект 'str' не имеет атрибута 'decode'. Ошибка Python 3?
Вот мой код:
import imaplib
from email.parser import HeaderParser
conn = imaplib.IMAP4_SSL('imap.gmail.com')
conn.login('[email protected]', 'password')
conn.select()
conn.search(None, 'ALL')
data = conn.fetch('1', '(BODY[HEADER])')
header_data = data[1][0][1].decode('utf-8')
в этот момент я получаю сообщение об ошибке
AttributeError: 'str' object has no attribute 'decode'
У Python 3 больше нет расшифровки, верно? Как я могу это исправить?
Также в:
data = conn.fetch('1', '(BODY[HEADER])')
Я выбираю только первое письмо. Как выбрать все?
Ответы
Ответ 1
Вы пытаетесь декодировать объект, который уже декодирован. У вас есть str
, нет необходимости расшифровывать его из UTF-8.
Просто отпустите часть .decode('utf-8')
:
header_data = data[1][0][1]
Что касается вашего вызова fetch()
, вы явно запрашиваете только первое сообщение. Используйте диапазон, если вы хотите получить больше сообщений. См. Документацию :
Параметры message_set для команд ниже - это строка, указывающая одно или несколько сообщений, которые должны быть приняты. Это может быть простой номер сообщения ('1'
), диапазон номеров сообщений ('2:4'
) или группа несмежных диапазонов, разделенных запятыми ('1:3,6:9'
). Диапазон может содержать звездочку, указывающую бесконечную верхнюю границу ('3:*'
).
Ответ 2
Начните с Python 3, вся строка будет unicode-объектом.
a = 'Happy New Year' # Python 3
b = unicode('Happy New Year') # Python 2
код до этого тот же. Поэтому я думаю, вы должны удалить .decode('utf-8')
. Поскольку вы уже получили объект unicode.
Ответ 3
Используйте его с помощью этого метода:
str.encode().decode()
Ответ 4
Я не знаком с библиотекой, но если ваша проблема в том, что вам не нужен массив байтов, один простой способ - указать тип кодировки прямо в трансляции:
>>> my_byte_str
b'Hello World'
>>> str(my_byte_str, 'utf-8')
'Hello World'
Ответ 5
Он уже расшифрован в Python3, попробуйте прямо, он должен работать.
Ответ 6
Для Python3
html = """\\u003Cdiv id=\\u0022contenedor\\u0022\\u003E \\u003Ch2 class=\\u0022text-left m-b-2\\u0022\\u003EInformaci\\u00f3n del veh\\u00edculo de patente AA345AA\\u003C\\/h2\\u003E\\n\\n\\n\\n \\u003Cdiv class=\\u0022panel panel-default panel-disabled m-b-2\\u0022\\u003E\\n \\u003Cdiv class=\\u0022panel-body\\u0022\\u003E\\n \\u003Ch2 class=\\u0022table_title m-b-2\\u0022\\u003EInformaci\\u00f3n del Registro Automotor\\u003C\\/h2\\u003E\\n \\u003Cdiv class=\\u0022col-md-6\\u0022\\u003E\\n \\u003Clabel class=\\u0022control-label\\u0022\\u003ERegistro Seccional\\u003C\\/label\\u003E\\n \\u003Cp\\u003ESAN MIGUEL N\\u00b0 1\\u003C\\/p\\u003E\\n \\u003Clabel class=\\u0022control-label\\u0022\\u003EDirecci\\u00f3n\\u003C\\/label\\u003E\\n \\u003Cp\\u003EMAESTRO ANGEL D\\u0027ELIA 766\\u003C\\/p\\u003E\\n \\u003Clabel class=\\u0022control-label\\u0022\\u003EPiso\\u003C\\/label\\u003E\\n \\u003Cp\\u003EPB\\u003C\\/p\\u003E\\n \\u003Clabel class=\\u0022control-label\\u0022\\u003EDepartamento\\u003C\\/label\\u003E\\n \\u003Cp\\u003E-\\u003C\\/p\\u003E\\n \\u003Clabel class=\\u0022control-label\\u0022\\u003EC\\u00f3digo postal\\u003C\\/label\\u003E\\n \\u003Cp\\u003E1663\\u003C\\/p\\u003E\\n \\u003C\\/div\\u003E\\n \\u003Cdiv class=\\u0022col-md-6\\u0022\\u003E\\n \\u003Clabel class=\\u0022control-label\\u0022\\u003ELocalidad\\u003C\\/label\\u003E\\n \\u003Cp\\u003ESAN MIGUEL\\u003C\\/p\\u003E\\n \\u003Clabel class=\\u0022control-label\\u0022\\u003EProvincia\\u003C\\/label\\u003E\\n \\u003Cp\\u003EBUENOS AIRES\\u003C\\/p\\u003E\\n \\u003Clabel class=\\u0022control-label\\u0022\\u003ETel\\u00e9fono\\u003C\\/label\\u003E\\n \\u003Cp\\u003E(11)46646647\\u003C\\/p\\u003E\\n \\u003Clabel class=\\u0022control-label\\u0022\\u003EHorario\\u003C\\/label\\u003E\\n \\u003Cp\\u003E08:30 a 12:30\\u003C\\/p\\u003E\\n \\u003C\\/div\\u003E\\n \\u003C\\/div\\u003E\\n\\u003C\\/div\\u003E \\n\\n\\u003Cp class=\\u0022text-center m-t-3 m-b-1 hidden-print\\u0022\\u003E\\n \\u003Ca href=\\u0022javascript:window.print();\\u0022 class=\\u0022btn btn-default\\u0022\\u003EImprim\\u00ed la consulta\\u003C\\/a\\u003E \\u0026nbsp; \\u0026nbsp;\\n \\u003Ca href=\\u0022\\u0022 class=\\u0022btn use-ajax btn-primary\\u0022\\u003EHacer otra consulta\\u003C\\/a\\u003E\\n\\u003C\\/p\\u003E\\n\\u003C\\/div\\u003E"""
print(html.replace("\\/", "/").encode().decode('unicode_escape'))