[英]extracting values from html table using beautifulsoup4 (2nd row onwards, 1st and 6th column)
[英]Extracting HTML table data from email to csv file, 1st column values to row headers, using Python
我正在嘗試通讀 outlook 文件夾並獲取 ReceivedTime,CC,Subject,HTMLBody 但將表格提取到列中。 我可以將 1) ReceivedTime,CC,Subject,HTMLBody 拉到 dataframe 中,我可以這樣做 2) 將 HTMLBody 表提取到 dataframe 中,但我無法同時執行 1) 和 2)。
當前代碼:
import win32com.client
import pandas as pd
from bs4 import BeautifulSoup
outlook = win32com.client.Dispatch("Outlook.Application")
mapi = outlook.GetNamespace("MAPI")
inbox = mapi.Folders[User@email.com'].Folders['Inbox'].Folders['Subfolder Name']
Mail_Messages = inbox.Items
for mail in Mail_Messages:
receivedtime = mail.ReceivedTime.strftime('%Y-%m-%d %H:%M:%S')
cc = mail.CC
body = mail.HTMLBody
html_body = BeautifulSoup(body,"lxml")
html_tables = html_body.find_all('table')[0]
df = pd.read_html(str(html_tables),header=None)[0]
display(df)
當前數據框顯示如下。 但我也想要相關的 ReceivedTime、CC 和主題。
0 | 1 | |
---|---|---|
0 | 報告名稱 | 報告.pdf |
1 | 隊名 | A組 |
2 | 項目名稱 | 項目A |
3 | 唯一 ID 號 | 123456789 |
4 | 截止日期 | 2021 年 1 月 1 日 |
但希望列 [0] 改為行標題。 因此,當每個 email 被讀取時,它會為收件箱子文件夾中的所有電子郵件生成一個看起來像這樣的 dataframe:
0 | 報告名稱 | 隊名 | 項目名稱 | 唯一 ID 號 | 截止日期 | 接收時間 | 抄送 | 主題 |
---|---|---|---|---|---|---|---|---|
1 | 報告.pdf | A組 | 項目A | 123456789 | 2021 年 1 月 5 日 | 2021 年 1 月 1 日凌晨 4 點 38 分 44 秒 | 用戶1@email.com,用戶2@email.com | 需要采取的行動:報告 A 即將到期 |
2 | ||||||||
3 | ||||||||
4 |
但是我被卡住了,仍然是一個初學者pythoner,但我看到的所有其他帖子並沒有完全讓我明白我正在嘗試做的事情。 我很感激這方面的任何幫助。
嘗試這個:
import win32com.client
import pandas as pd
from bs4 import BeautifulSoup
from pprint import pprint
outlook = win32com.client.Dispatch("Outlook.Application")
mapi = outlook.GetNamespace("MAPI")
inbox = mapi.Folders['User@email.com'].Folders['Inbox'].Folders['Subfolder Name']
Mail_Messages = inbox.Items
# a list where contents of each e-mail - CC, receiv.time and subject will have been put
contents = []
column_names = ['Report Name', 'Team Name', 'Project Name', 'Unique ID Number', 'Due Date', 'ReceivedTime', 'CC', 'Subject']
for mail in Mail_Messages:
body = mail.HTMLBody
html_body = BeautifulSoup(body, "lxml")
html_tables = html_body.find_all('table')
# uncomment following lines if you want to have column names defined programatically rather than hardcoded
# column_names = pd.read_html(str(html_tables), header=None)[0][0]
# column_names = column_names.tolist()
# column_names.append("CC")
# column_names.append("Received Time")
# column_names.append("Subject")
# a list containing a single e-mail data - html table, CC, receivedTime and subject
row = pd.read_html(str(html_tables), header=None)[0][1]
row = row.tolist()
row.append(mail.CC)
row.append(mail.ReceivedTime.strftime('%Y-%m-%d %H:%M:%S'))
row.append(mail.Subject)
# appending each full row to a list
contents.append(row)
# and finally converting a list into dataframe
df = pd.DataFrame(contents, columns=column_names)
pprint(df)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.