Форум сайта python.su
Товарищи, помогите решить проблему.
Парсю файлы с электронными письмами с помощью модуля email. С самим текстом писем никаких проблем а вот декодировать русский Subject письма никак не получается.
Пытаюсь сделать так:
In [101]: m["Subject"].decode("Koi8-r")
Out[101]: u'=?koi8-r?B?5PDyL+3v8uU=?='
Офлайн
Используйте метод 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])
Офлайн
truporezВыдает:
print msg print unicode(decode_header(msg))
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128)
Офлайн
И как получить тело сообщения в декодированном виде в формате строки?
Офлайн
изначально вопрос был про тему письма. получить строку можно так:
subj = unicode(decode_header(msg['Subject'])[0][0])
Офлайн
truporezUnicodeDecodeError: ‘ascii’ codec can't decode byte 0xe4 in position 0: ordinal not in range(128)
Офлайн
пробуй кодировку cp1251 …. и напиши код после которого у тебя выходит эта ошибка….возможно подойдет что то вроде
y = unicode(my_response.read(), 'utf-8')
Офлайн
truporezнаверно правильнее будет так:
Используйте метод decode_header из email.headerprint unicode(decode_header(msg['Subject'])[0][0])
content, encode = decode_header(msg["Subject"])[0]
if encode:
content = content.decode(encode)
print(content)
Офлайн
Спасибо за помощь.
Привожу код, который сейчас есть. В итоге я хочу парсить тело письма, чтобы доставать оттуда широты и долготы по признаку 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)
Офлайн
XdenisXЭто не ошибка кодировки. Бросьте pyparsing, который совершенно избыточен для ваших целей и с которым вы не разобрались, и возьмите модуль re он полностью покроет ваши запросы и идет в стандартной поставке.ParseException: Expected Re:('LAT') (at char 0), (line:1, col:1)
Офлайн