Найти - Пользователи
Полная версия: Декодирование заголвка сообщений
Начало » Python для новичков » Декодирование заголвка сообщений
1 2
XdenisX
Товарищи, помогите решить проблему.

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

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

In [101]: m["Subject"].decode("Koi8-r")
Out[101]: u'=?koi8-r?B?5PDyL+3v8uU=?='
truporez
Используйте метод 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])
XdenisX
truporez
print msg print unicode(decode_header(msg))
Выдает:
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128)
XdenisX
И как получить тело сообщения в декодированном виде в формате строки?
truporez
изначально вопрос был про тему письма. получить строку можно так:
subj = unicode(decode_header(msg['Subject'])[0][0])
а еще лучше прочитайте документацию по поводу возвращаемых параметров, там много интересного.
XdenisX
truporez
UnicodeDecodeError: ‘ascii’ codec can't decode byte 0xe4 in position 0: ordinal not in range(128)

Попробовал на разных сообщениях и везде такой результат(
Чел_вТапКах
пробуй кодировку cp1251 …. и напиши код после которого у тебя выходит эта ошибка….возможно подойдет что то вроде
y = unicode(my_response.read(), 'utf-8')
pyuser
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)
XdenisX
Спасибо за помощь.

Привожу код, который сейчас есть. В итоге я хочу парсить тело письма, чтобы доставать оттуда широты и долготы по признаку 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)
PooH
XdenisX
ParseException: Expected Re:('LAT') (at char 0), (line:1, col:1)
Это не ошибка кодировки. Бросьте pyparsing, который совершенно избыточен для ваших целей и с которым вы не разобрались, и возьмите модуль re он полностью покроет ваши запросы и идет в стандартной поставке.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB