development

'str'오브젝트에는 'decode'속성이 없습니다.

big-blog 2020. 6. 21. 19:06
반응형

'str'오브젝트에는 'decode'속성이 없습니다. 파이썬 3 오류?


내 코드는 다음과 같습니다.

import imaplib
from email.parser import HeaderParser

conn = imaplib.IMAP4_SSL('imap.gmail.com')
conn.login('example@gmail.com', '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'

파이썬 3는 더 이상 해독하지 않습니다. 이 문제를 어떻게 해결할 수 있습니까?

또한,

data = conn.fetch('1', '(BODY[HEADER])')

첫 번째 이메일 만 선택하고 있습니다. 모두 선택하려면 어떻게합니까?


이미 디코딩 된 객체를 디코딩하려고합니다 . 당신은 str더 이상 UTF-8에서 디코딩 할 필요가 없습니다.

.decode('utf-8')부품을 간단히 떨어 뜨립니다 .

header_data = data[1][0][1]

당신의 fetch()전화에 관해서 , 당신은 명시 적으로 첫 번째 메시지를 요구하고 있습니다. 더 많은 메시지를 검색하려면 범위를 사용하십시오. 설명서를 참조하십시오 :

아래의 명령에 대한 message_set 옵션은 수행 할 하나 이상의 메시지를 지정하는 문자열입니다. 간단한 메시지 번호 ( '1'), 메시지 번호 범위 ( '2:4') 또는 쉼표 ( '1:3,6:9') 로 구분 된 비 연속 범위 그룹 일 수 있습니다. 범위에는 별표가 포함되어 무한한 상한 ( '3:*') 을 나타냅니다 .


파이썬 3부터 모든 문자열은 유니 코드 객체입니다.

  a = 'Happy New Year' # Python 3
  b = unicode('Happy New Year') # Python 2

이전 코드는 동일합니다. 따라서를 제거해야한다고 생각합니다 .decode('utf-8'). 이미 유니 코드 객체를 얻었 기 때문입니다.


이 방법으로 사용하십시오.

str.encode().decode()

나는 라이브러리에 익숙하지 않지만 문제가 바이트 배열을 원하지 않는다면 캐스트에서 인코딩 유형을 직접 지정하는 것이 가장 쉬운 방법입니다.

>>> my_byte_str
b'Hello World'

>>> str(my_byte_str, 'utf-8')
'Hello World'

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'))

이미 Python3에서 디코딩되었으므로 직접 시도해보십시오.

참고 URL : https://stackoverflow.com/questions/28583565/str-object-has-no-attribute-decode-python-3-error

반응형