Python 3中为何仅提取Excel表格首个单元格?程序需求说明
问题分析与解决方案
从你提供的代码片段来看,核心问题是没有遍历Excel工作表中的所有URL单元格——目前的代码仅获取了工作表对象,但缺少对所有行/单元格的循环处理,自然只会默认处理第一个单元格的数据。下面结合你的需求(从WHOIS数据提取邮箱)给出完整修复方案:
方案1:基于xlrd遍历工作表
补全遍历逻辑,同时完善WHOIS邮箱提取的异常处理:
import whois import xlrd import tkinter from tkinter import filedialog # 选择Excel文件,隐藏多余的tk窗口 root = tkinter.Tk() root.withdraw() filename = filedialog.askopenfilename( initialdir="/", title="Select file", filetypes=(("xls files", "*.xls"), ("all files", "*.*")) ) # 读取目标工作表 workbook = xlrd.open_workbook(filename) sheet = workbook.sheet_by_index(0) # 遍历所有行(假设第0行是表头,从第1行开始取URL;无表头则从0开始) for row_idx in range(1, sheet.nrows): # 获取当前行第一列的URL(根据你的Excel结构调整列索引) site_url = sheet.cell_value(row_idx, 0) print(f"正在处理URL: {site_url}") try: # 获取WHOIS数据 whois_data = whois.whois(site_url) # 提取邮箱(whois返回的emails可能是列表或单个字符串) emails = whois_data.emails if emails: output_emails = ', '.join(emails) if isinstance(emails, list) else emails print(f"提取到邮箱: {output_emails}") else: print(f"未找到邮箱: {site_url}") except Exception as e: print(f"处理{site_url}出错: {str(e)}")
方案2:基于pandas(更简洁易读)
你已经导入了pandas,用它读取Excel会更高效,代码逻辑更清晰:
import whois import pandas as pd import tkinter from tkinter import filedialog # 选择文件 root = tkinter.Tk() root.withdraw() filename = filedialog.askopenfilename( initialdir="/", title="Select file", filetypes=(("xls files", "*.xls"), ("all files", "*.*")) ) # 读取Excel,若URL列有表头则用df["URL"],无表头则用row[0] df = pd.read_excel(filename) # 遍历每行的URL for index, row in df.iterrows(): site_url = row[0] # 根据你的Excel结构调整列索引或列名 print(f"正在处理URL: {site_url}") try: whois_data = whois.whois(site_url) emails = whois_data.emails if emails: output_emails = ', '.join(emails) if isinstance(emails, list) else emails print(f"提取到邮箱: {output_emails}") else: print(f"未找到邮箱: {site_url}") except Exception as e: print(f"处理{site_url}失败: {str(e)}")
关键注意事项
- 调整列索引:根据你的Excel中URL所在的列,修改代码中的列索引(比如URL在第二列就把
0改成1)。 - 异常处理:WHOIS查询可能因网络问题、域名不存在等报错,
try-except块能避免程序直接崩溃。 - 窗口优化:用
root.withdraw()隐藏tk的空白主窗口,提升交互体验。
内容的提问来源于stack exchange,提问作者Mike Kordvani




