2017-01-24 3 views
1

У меня есть папка из 150 писем, все сохраненные как файлы HTML (расширения Firefox), и мне нужно записать год, который всегда находится в строке «Отправлено»; как показано на фотографии ниже.Разбор строки «Отправлено» по электронной почте

enter image description here

Я попытался с помощью регулярных выражений, но это не удалось; он не печатает никакого результата вообще, указывая мне, что мой RegEx не работал. Я пробовал использовать команды get_payload() и message_from_string() из модуля email, но поскольку это документ HTML, это не удалось. Затем я попытался использовать BeautifulSoup, чтобы захватить всю электронную почту, а затем проанализировать только строку «Отправлено», но мне не удалось по неизвестным причинам. Я не эксперт ни с одним из этих модулей, поэтому любая помощь будет оценена по достоинству.

Соответствующий код, который я пробовал:

for filename in os.listdir(path): 
    file_path = os.path.join(path, filename) 
    if os.path.isfile(file_path): 
     html_ = open(file_path, 'r').read() 
     soup_ = BeautifulSoup(html, 'lxml') 
     pattern = re.compile(r'Sent:/s([/d]{4})') 
     txt = html.read() 
     dates = pattern.findall(txt) 
     if "Sent" in line: 
      print("Date:", ''.join(dates)) 
+2

Использовать 'r'Sent:. *? \ B (\ d {4}) \ b'' –

+0

Я думаю, что это зависит от форматирования электронной почты в формате HTML ... Кроме того, есть ли способ получить сырые данные электронной почты? Parsing _that_ может быть проще с тех пор вам просто нужно найти «Отправленный» заголовок ... – mgilson

+0

@ WiktorStribiżew, который отлично поработал вам. Я действительно думал, что мои навыки в RegEx улучшились, и на этот раз я получил бы это самостоятельно, но я могу сказать, прочитав ваше, что я был довольно далеко – theprowler

ответ

2

Вашего регулярное выражение (я думаю, что слэш просто опечатка) на самом деле не соответствует символу между Sent: и годом. Вы можете исправить регулярное выражение, как

r'Sent:.*?\b(\d{4})\b' 

Или - чтобы учесть тот факт, что Sent появляется в начале строки:

r'(?m)^Sent:.*?\b(\d{4})\b' 

Подробности:

  • (?m)^ - начало строки
  • Sent: - последовательность символьных символов
  • .*? - любые 0+, кроме символов разрыва строки символов, как можно
  • \b(\d{4})\b - целое слово, состоящее из 4-х цифр (захваченный в 1-й группе и, таким образом, возвращается в качестве результата re.findall.)