使用C#将Selenium爬取的数据写入Excel失败,生成文件为空
问题分析与解决方案
核心问题总结
你的代码生成空Excel的根源是数据采集环节的逻辑错误,导致DataTable未正确填充有效数据,后续OpenXML写入自然为空。
具体问题点及修复步骤
1. 数据采集的循环与对象赋值错误
- 问题:遍历职位元素时,内层循环中每次创建新的
Item对象但未赋值Titles和JobLinks,反而丢弃了已收集数据的item实例,最终items列表中的对象缺失关键信息。 - 修复:调整循环逻辑,确保每个职位对应一个完整的
Item对象:foreach (var job in eachJob) { var item = new Item(); // 提取职位标题 var titleElements = job.FindElements(By.CssSelector("span[title]")); if (titleElements.Any()) { item.Titles.Add(titleElements.First().GetAttribute("title")); } // 提取公司名称 var companyNameElement = job.FindElement(By.XPath(".//span[@data-testid='company-name']")); item.CompanyName = companyNameElement.Text; // 提取发布日期 var publishedElement = job.FindElement(By.XPath(".//span[@class='date']")); item.PublishDate = publishedElement.Text; // 提取职位链接 var joblinkElements = job.FindElements(By.CssSelector("a.jcs-JobTitle")); foreach (var link in joblinkElements) { item.JobLinks.Add(link.GetAttribute("href")); } // 将完整的Item加入列表 items.Add(item); }
2. DataTable列顺序不匹配
- 问题:
DataTable的列顺序是Nome da Empresa、Titulo、Data、Link,但添加行时参数顺序为CompanyName、PublishDate、Titles、JobLinks,不仅顺序错位,集合类型直接转字符串会显示为类型名而非实际内容。 - 修复:调整参数顺序,并将集合转为可读字符串:
foreach (var item in items) { string titles = string.Join(", ", item.Titles); string links = string.Join(", ", item.JobLinks); dataTable.Rows.Add(item.CompanyName, titles, item.PublishDate, links); }
3. 页面加载等待不充分
- 问题:输入"remoto"回车后直接定位职位列表,未等待页面完全加载,可能导致
eachJob为空集合。 - 修复:添加显式等待确保列表加载完成:
// 等待职位列表可见 wait.Until(ExpectedConditions.ElementIsVisible(By.XPath("//*[@id=\"mosaic-provider-jobcards\"]/ul"))); IWebElement allJobs = driver.FindElement(By.XPath("//*[@id=\"mosaic-provider-jobcards\"]/ul"));
4. 弹窗关闭逻辑的空引用风险
- 问题:判断
closePopup != null后同时点击两个弹窗元素,若closeGooglePopup为null会引发异常。 - 修复:分别判断并处理:
if (closeGooglePopup != null) closeGooglePopup.Click(); if (closePopup != null) closePopup.Click();
OpenXML写入环节优化(非空文件直接原因)
- 创建
SheetData时直接关联,避免潜在的空引用:SheetData sheetData = new SheetData(); worksheetPart.Worksheet = new Worksheet(sheetData); using块会自动处理文档保存,无需单独调用workbookPart.Workbook.Save()。
验证步骤
修复后先确认控制台输出的职位数据完整,再检查DataTable的行数和内容,最终生成的Excel文件即可包含正确的职位信息。
内容的提问来源于stack exchange,提问作者olamundo97
相关产品推荐
相关产品推荐

