Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 26, 2010 01:28:18

shkaff
От:
Зарегистрирован: 2010-11-25
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Как раскодировать \xd3\xe2\xe0\xe6\xe0\xe5\xec\xfb\xe9 ...

Гугл меня уже забанит скоро, сколько я его дрючу по этому поводу
Не могу раскодировать сообщение, пришедшее на gmail

search_criterion = '(SENTSINCE 25-Nov-2010)'

gm = imaplib.IMAP4_SSL('imap.gmail.com', 993)
gm.login( bytes('mylogin@gmail.com', 'ASCII'), bytes('mypassword', 'ASCII') )
status, count = gm.select('Inbox', imaplib.IMAP4_SSL.readonly)

typ, data = gm.search(None, search_criterion)
messages = data[0].split()
message_count = len(messages)for k in range(first ,message_count) :
# list the last email found
typ, message_parts = gm.fetch(messages[len(messages)-1], 'RFC822')
message_body = str( message_parts[0][1] )
msg = email.message_from_string( message_body )
print(msg)
for part in msg.walk():
print(part.get_payload())
И печатает ерунду вида “\xd3\xe2\xe0\xe6\xe0\xe5\xec\xfb\xe9 \xea\xeb\xe8\xe5\xed\xf2”
Это что за кодировка и как еще перевести в человеческий вид, чтобы получилось “Уважаемый клиент”

Подскажите пожалуйста где грабли

Атачментов нет никаких, только plaint text, но формат сообщения геморойный какойто:
...
Mime-Version: 1.0
Content-Type: multipart/alternative;
tboundary="----=_Part_22273_1831234854.1290718992094"
urn:schemas:mailheader:content-type: multipart/mixed

------=_Part_22273_1831234854.1290718992094
Content-Type: text/plain; charset=Windows-1251
Content-Transfer-Encoding: binary

\xd3\xe2\xe0\xe6\xe0\xe5\xec\xfb\xe9 \xea\xeb\xe8\xe5\xed\xf2...



Офлайн

#2 Ноя. 26, 2010 01:58:38

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Как раскодировать \xd3\xe2\xe0\xe6\xe0\xe5\xec\xfb\xe9 ...

Ловкость рук - и никакого мошенничества:

>>> s = "\xd3\xe2\xe0\xe6\xe0\xe5\xec\xfb\xe9 \xea\xeb\xe8\xe5\xed\xf2"
>>> import feedparser
>>> feedparser.parse(s)
{'feed': {}, 'encoding': 'MacCyrillic', 'bozo': 1, 'version': '', 'namespaces': {}, 'entries': [], 'bozo_exception': SAXParseException('Document is empty\n',)}
>>> s.decode('MacCyrillic')
u'\u201d\u0432\u0430\u0436\u0430\u0435\u043c\u044b\u0439 \u043a\u043b\u0438\u0435\u043d\u0442'
>>> print s.decode('MacCyrillic')
”важаемый клиент
>>>



Офлайн

#3 Ноя. 26, 2010 02:01:14

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9960
Репутация: +  856  -
Профиль   Отправить e-mail  

Как раскодировать \xd3\xe2\xe0\xe6\xe0\xe5\xec\xfb\xe9 ...

>>> b = b"\xd3\xe2\xe0\xe6\xe0\xe5\xec\xfb\xe9 \xea\xeb\xe8\xe5\xed\xf2"
>>> s = b.decode('cp1251')
>>> s
'Уважаемый клиент'
>>>
>>> s = "\xd3\xe2\xe0\xe6\xe0\xe5\xec\xfb\xe9 \xea\xeb\xe8\xe5\xed\xf2"
>>> s
'Óâàæàåìûé êëèåíò'
>>> d = {'Ó': 'У', 'â': 'в', 'à': 'а', 'æ': 'ж', 'å': 'е', 'ì': 'м', 'û': 'ы', 'é': 'й', 'ê': 'к', 'ë': 'л', 'è': 'и', 'í': 'н', 'ò': 'т' }
>>> s.translate(str.maketrans(d))
'Уважаемый клиент'
>>>



Отредактировано (Ноя. 26, 2010 02:16:00)

Офлайн

#4 Ноя. 27, 2010 00:32:37

shkaff
От:
Зарегистрирован: 2010-11-25
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Как раскодировать \xd3\xe2\xe0\xe6\xe0\xe5\xec\xfb\xe9 ...

Андрей, спасибо, а этот feedparser я правильно понимаю что не стандартный модуль, а нечто специальное возможно с http://feedparser.org/ ?

py.user.next, спасибо за примерчики, мне очень понравился по лаконичности первый, только в нем входная строка с помощью префикса b изначально задается как bytes, что удобно для демонстрации, но затруднительно в практике, поскольку входную строку я получаю именно как str в результате вызова функции part.get_payload()

И если я правильно понял, сконвертировать str в bytes не сложно, но необходимо опять же указывать кодировку
Судьба сжалилась надомной, и мне удалось догадаться использовать ISO-8859-1, и в итоге заработала конструкция

bytes( part.get_payload(), ‘ISO-8859-1’ ).decode( ‘cp1251’ )

Хотя странно все это, ей богу



Офлайн

#5 Ноя. 27, 2010 01:31:17

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Как раскодировать \xd3\xe2\xe0\xe6\xe0\xe5\xec\xfb\xe9 ...

Да, это feedparser.org
И чем больший текст вы ему скармливаете - тем лучше он угадывает.

Надеюсь, у вас python2?
Честно говоря, email (и imaplib) в python 3.1 практически непригодны к использованию. Именно из-за кодировок.
В не вышедшем еще 3.2 ситуация значительно лучше. Не знаю, полностью ли все исправлено - но изменений очень много.

Если работаете с двойкой - bytes не для вас.
Если с тройкой - для текста письма (но не для для attachment) уже должна быть строка (т.е. уже правильно преобразованный юникод). Что, повторяюсь, безбожно глючит в Python 3.1 для неанглийских текстов.



Офлайн

#6 Ноя. 27, 2010 07:59:59

pyuser
От:
Зарегистрирован: 2007-05-13
Сообщения: 658
Репутация: +  36  -
Профиль   Отправить e-mail  

Как раскодировать \xd3\xe2\xe0\xe6\xe0\xe5\xec\xfb\xe9 ...

Андрей Светлов
безбожно глючит в Python 3.1 для неанглийских текстов
Полностью с Вами согласен. Возможно это не понацея от всех бед, но
msg = email.message_from_string(str(b"\n".join(lines), "ascii", "ignore"))
эта строка позволила мне без проблем работать с письмами, содержащими русский текст, в кодировках utf-8, windows-1251, koi-8r



Отредактировано (Ноя. 27, 2010 08:01:18)

Офлайн

#7 Ноя. 29, 2010 00:47:23

shkaff
От:
Зарегистрирован: 2010-11-25
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Как раскодировать \xd3\xe2\xe0\xe6\xe0\xe5\xec\xfb\xe9 ...

Не умно с моей стороны было не указать про версию.
И не умно было пытаться пробовать сделать это на тройке, как я теперь понимаю.
Спасибо за моральную поддержку, а то я себе весь волосеной покров выдераю, пока что еще только на голове, и никак не пойму почему кодировка в теле письма прописана 1251, а любые попытки узнать об этом через методы get_charset, get_content_type никак не сообщали о кодировке.
Точно глючит. Мрак какойто. Ни как не мог предположить, что это настолько сыро.

pyuser, а в указаном коде “lines” это должно быть типа bytes, верно?

У меня тело письма получается следующим образом

typ, message_parts = gm.fetch(messages[k], 'RFC822')
message_body = str( message_parts[0][1] )
Стало быть, надо еще message_body в bytes конвертить?



Отредактировано (Ноя. 29, 2010 00:48:17)

Офлайн

#8 Ноя. 30, 2010 09:09:52

shkaff
От:
Зарегистрирован: 2010-11-25
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Как раскодировать \xd3\xe2\xe0\xe6\xe0\xe5\xec\xfb\xe9 ...

Все. перебил заголовок с #!/usr/bin/env python3 на #!/usr/bin/env python и проблем перестало быть!
Правда в pytty сменил кодировку с utf8 на cp1251, но и это уже большое достижение… не вижу никаких теперь \xd3\xe2\…!
Задолбал питон3, как же хорош питон2!



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version