Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 4, 2010 12:02:30

XdenisX
От:
Зарегистрирован: 2009-10-31
Сообщения: 30
Репутация: +  0  -
Профиль   Отправить e-mail  

Декодирование заголвка сообщений

Товарищи, помогите решить проблему.

Парсю файлы с электронными письмами с помощью модуля email. С самим текстом писем никаких проблем а вот декодировать русский Subject письма никак не получается.

Пытаюсь сделать так:

In [101]: m["Subject"].decode("Koi8-r")
Out[101]: u'=?koi8-r?B?5PDyL+3v8uU=?='



Офлайн

#2 Фев. 4, 2010 12:10:13

truporez
От:
Зарегистрирован: 2009-05-08
Сообщения: 266
Репутация: +  6  -
Профиль   Адрес электронной почты  

Декодирование заголвка сообщений

Используйте метод decode_header из email.header

from email.parser import Parser
from email.header import decode_header

parser = Parser()
msg = parser.parse( open("mail.txt", 'rb') )
print msg['Subject']
print unicode(decode_header(msg['Subject'])[0][0])



Офлайн

#3 Фев. 4, 2010 12:24:28

XdenisX
От:
Зарегистрирован: 2009-10-31
Сообщения: 30
Репутация: +  0  -
Профиль   Отправить e-mail  

Декодирование заголвка сообщений

truporez
print msg print unicode(decode_header(msg))
Выдает:
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128)



Офлайн

#4 Фев. 4, 2010 13:26:32

XdenisX
От:
Зарегистрирован: 2009-10-31
Сообщения: 30
Репутация: +  0  -
Профиль   Отправить e-mail  

Декодирование заголвка сообщений

И как получить тело сообщения в декодированном виде в формате строки?



Офлайн

#5 Фев. 4, 2010 13:45:20

truporez
От:
Зарегистрирован: 2009-05-08
Сообщения: 266
Репутация: +  6  -
Профиль   Адрес электронной почты  

Декодирование заголвка сообщений

изначально вопрос был про тему письма. получить строку можно так:

subj = unicode(decode_header(msg['Subject'])[0][0])
а еще лучше прочитайте документацию по поводу возвращаемых параметров, там много интересного.



Офлайн

#6 Фев. 5, 2010 15:16:58

XdenisX
От:
Зарегистрирован: 2009-10-31
Сообщения: 30
Репутация: +  0  -
Профиль   Отправить e-mail  

Декодирование заголвка сообщений

truporez
UnicodeDecodeError: ‘ascii’ codec can't decode byte 0xe4 in position 0: ordinal not in range(128)

Попробовал на разных сообщениях и везде такой результат(



Офлайн

#7 Фев. 5, 2010 17:03:57

Чел_вТапКах
От:
Зарегистрирован: 2009-07-22
Сообщения: 92
Репутация: +  0  -
Профиль   Отправить e-mail  

Декодирование заголвка сообщений

пробуй кодировку cp1251 …. и напиши код после которого у тебя выходит эта ошибка….возможно подойдет что то вроде

y = unicode(my_response.read(), 'utf-8')



Офлайн

#8 Фев. 6, 2010 02:12:01

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

Декодирование заголвка сообщений

truporez
Используйте метод decode_header из email.header
print unicode(decode_header(msg['Subject'])[0][0])
наверно правильнее будет так:
content, encode = decode_header(msg["Subject"])[0]
if encode:
content = content.decode(encode)
print(content)



Офлайн

#9 Фев. 6, 2010 18:52:25

XdenisX
От:
Зарегистрирован: 2009-10-31
Сообщения: 30
Репутация: +  0  -
Профиль   Отправить e-mail  

Декодирование заголвка сообщений

Спасибо за помощь.

Привожу код, который сейчас есть. В итоге я хочу парсить тело письма, чтобы доставать оттуда широты и долготы по признаку LAT + число и LON + число соответственно. Но парсер ругается на кодировку (как мне кажется) того, что я ему подаю на вход. Если вместо $content ввести что-нибудь вроде “LAT 30.0 blablabla 123” все будет работать, а вот в случае с текстом сообщения - нет(

# -*- coding: utf-8 -*-
import email
from email.header import decode_header
import sys
from pyparsing import *

f = open(sys.argv[1],"r") # Open message file
m = email.message_from_file(f) # Parse message
charset = m.get_charset()

# Print short summary of sender/recipient
print("From : %s" % m["from"])

to, encode = decode_header(m["to"])[0]
if encode:
to = to.decode(encode)
print("To : %s" % to)

tema, encode = decode_header(m["Subject"])[0]
if encode:
tema = tema.decode(encode)
print("Subject : %s" % tema)
print("")

#Числа
number=Word(".-"+nums)
#Долгота
lon=Regex("LON")+number
#Широта
lat=Regex("LAT")+number

if (tema=="Координаты"):
if not m.is_multipart():
payload = m.get_payload(decode=True)
charset = m.get_content_charset('')
print(payload.decode(charset))
#Строка с сообщением
content=payload.decode(charset)
#Разбор сообщения
llat=lat.parseString(content)
Парсер выдает ошибку:
ParseException: Expected Re:('LAT') (at char 0), (line:1, col:1)



Отредактировано (Фев. 6, 2010 18:55:12)

Офлайн

#10 Фев. 11, 2010 19:10:48

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

Декодирование заголвка сообщений

XdenisX
ParseException: Expected Re:('LAT') (at char 0), (line:1, col:1)
Это не ошибка кодировки. Бросьте pyparsing, который совершенно избыточен для ваших целей и с которым вы не разобрались, и возьмите модуль re он полностью покроет ваши запросы и идет в стандартной поставке.



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version