使用Selenium从Hotmail/Outlook提取邮件内容保存到TXT的问题求助
核心错误梳理
- 逻辑顺序错:原代码遍历邮件列表时只执行点击操作,所有邮件点完才提取一次内容,最终只能拿到最后一封的内容
- 定位方法不存在:Selenium没有
find_element_by_dir内置方法,需要用xpath/css选择器匹配dir="Itr"的div元素 - 无加载等待:点击邮件后内容区需要加载时间,直接提取会找不到元素或读取到旧内容
- 列表元素易失效:点击邮件后页面DOM刷新,最初获取的邮件列表元素会失效,后续点击会抛出异常
- 写入逻辑错误:循环内重复拼接字符串、重复打开文件追加,会导致内容重复写入
修正后可运行代码
import time import os from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC emailcontent = [] def getEmails(self): self.browser.get("https://outlook.live.com/mail/0/inbox") time.sleep(3) # 先统计邮件总数,避免后续元素失效影响遍历 email_count = len(self.browser.find_elements(By.CSS_SELECTOR, "._2ZDUqsleGa-jar5wAYvVzV")) for i in range(email_count): # 每次循环重新获取邮件列表,解决DOM刷新导致的元素失效问题 emails = self.browser.find_elements(By.CSS_SELECTOR, "._2ZDUqsleGa-jar5wAYvVzV") emails[i].click() # 显式等待邮件内容加载完成 WebDriverWait(self.browser, 10).until( EC.presence_of_element_located((By.XPATH, '//div[@dir="Itr"]')) ) # 提取当前打开的邮件内容 content = self.browser.find_element(By.XPATH, '//div[@dir="Itr"]').text emailcontent.append(content) # 小间隔避免请求过快触发反爬 time.sleep(1) getEmails() # 统一写入文件,减少重复IO操作,加utf-8编码避免乱码 with open("new.txt", "w", encoding="utf-8") as output: for a in emailcontent: output.write(f"{a:<30}\n") os.startfile('new.txt')
内容的提问来源于stack exchange,提问作者eyup.tatar
相关产品推荐
相关产品推荐

