Синтаксический анализатор почты Python с Beautifulsoup — Изо всех сил пытается проанализировать весь почтовый ящик

#python #beautifulsoup #html-parsing

Вопрос:

Я новичок в мире python и хотел бы получить некоторую помощь с анализатором электронной почты, который я пытаюсь написать.

У меня есть почтовый ящик, который содержит только электронную почту с таблицей HTML в теле (все сообщения отформатированы одинаково).

Я хочу проанализировать весь почтовый ящик и извлечь данные из каждой таблицы HTML, чтобы их можно было сохранить в виде одного csv-файла.

Мне удалось подключиться к почтовому ящику, вытащить последнее электронное письмо и успешно проанализировать таблицу и сохранить ее в csv-файл.

Сейчас я пытаюсь просмотреть все электронные письма во входящих и извлечь данные из каждой таблицы в файл csv, но я не знаю, с чего начать.

Кто-нибудь может дать какой-нибудь совет, пожалуйста ?

Мой код до сих пор таков :

 import imaplib
from email.parser import BytesParser, Parser
from email.policy import default
from bs4 import BeautifulSoup

USER = 'USERNAME' #Removed for this post 
PASSWORD ='PASSWORD' #Removed for this post 

mail = imaplib.IMAP4_SSL('MAILSERVER') #Removed for this post 
mail.login(USER, PASSWORD)
mail.list()
mail.select('inbox')

result, data = mail.uid('search', None, "ALL")
latest_email_uid = data[0].split()[-1]
result, data = mail.uid('fetch', latest_email_uid, '(RFC822)')
raw_email = data[0][1]


email_message = BytesParser(policy=default).parsebytes(raw_email)

simplest = email_message.get_body(preferencelist=('html'))
htmlcontent = simplest.get_content()

data = []
list_header =[]

soup = BeautifulSoup(htmlcontent, 'html.parser')

table = soup.find("table")

output_rows = []
for table_row in table.findAll('tr'):
    columns = table_row.findAll('td')
    output_row = []
    for column in columns:
        relevant = column.text.replace('n', '')
        relevant2 = relevant.replace('xa0', '')
        output_row.append(relevant2)
    output_rows.append(output_row)

print (output_rows) 
with open('output.csv', 'w') as csvfile:
    writer = csv.writer(csvfile)
    writer.writerows(output_rows)       
 

То, что я сделал до сих пор, вероятно, не самый лучший / самый профессиональный способ сделать это, но, как я уже сказал, я только начал изучать python.

Спасибо, что нашли время почитать.

Ответ №1:

документация для imaplib содержит пример, который мог бы вам помочь

просто прочитайте полный результат вашего запроса:

 result, data = mail.uid('search', None, "ALL")
for num in data[0].split():
    result, data = mail.uid('fetch', num, '(RFC822)')
    raw_email = data[0][1]
 

вам придется заново создать остальной код (или использовать функции, что намного лучше).