#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]
вам придется заново создать остальной код (или использовать функции, что намного лучше).