0

我正在尝试在 python 中导入电子邮件中的 HTML 表。

我尝试了以下脚本:

HOST = 'imap.gmail.com'
USERNAME = username
PASSWORD = password
ssl = True

server = IMAPClient(HOST, use_uid=True, ssl=ssl)
server.login(USERNAME, PASSWORD)

select_info = server.select_folder('INBOX')
messages = server.search(['FROM', sender_address])

if len(messages) > 0:
   for mail_id, data in server.fetch(messages,['ENVELOPE','BODY[TEXT]']).items():
       envelope = data[b'ENVELOPE']
       body = data[b'BODY[TEXT]']

soup = BeautifulSoup(body)
table = soup.find_all('table')
df = pd.read_html(str(table))[0]

该脚本工作正常,但我在表格中插入了一些随机的“=”和“<= /td>”。这是带有黄色错误的数据帧输出示例 在此处输入图像描述

这是原始电子邮件表的示例: 在此处输入图像描述

我认为错误出在 IMAPClient 命令中(而不是在 BS 解析或 pandas 中),因为如果我检查“body”变量中的 HTML,我会发现错误已经存在。

我究竟做错了什么?谢谢

4

1 回答 1

1

如果有人需要它,以下代码可以正常工作:

imap = imaplib.IMAP4_SSL('imap.gmail.com')
imap.login(username, password)
imap.select("inbox")

resp, items = imap.search(None, '(FROM "xxxx@xxxxxxxxx.com")')

for n, num in enumerate(items[0].split(), 1):
    resp, data = imap.fetch(num, '(RFC822)')

    body = data[0][1]
    msg = email.message_from_bytes(body)
    content = msg.get_payload(decode=True)

    soup = BeautifulSoup(content)
    table = soup.find_all('table')
    df = pd.read_html(str(table))[0]
于 2021-12-01T18:45:57.853 回答