解析电子邮件中的“已发送”行

时间:2017-01-24 18:49:13

标签: python regex email beautifulsoup

我有一个约150封电子邮件的文件夹,全部保存为HTML文件(Firefox扩展名),我需要捕获始终在“已发送”行中找到的年份;如下图所示。

enter image description here

我尝试使用RegEx,但失败了;它根本不会打印任何结果,向我表明我的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))

1 个答案:

答案 0 :(得分: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的结果返回。)