Python Selenium+Pandas爬取含缺失属性的网页表格问题求助
解决Selenium爬取表格时空单元格导致的数据混乱问题
你的核心问题是全局try-except块会因单个字段异常终止整个循环,且未处理空单元格的默认值,导致数据不完整或结构混乱。以下是针对性的解决方案:
核心思路
将错误处理从「整行/整循环」缩小到「单个字段」,确保每个字段的获取失败不会影响其他字段和整行数据的保留;同时为空值/异常字段设置默认值,保证数据结构的一致性。
方案1:封装安全获取属性的辅助函数
先写一个通用函数处理单个元素的属性获取,自动捕获异常并返回默认值:
def safe_get_attr(element, attr_name='textContent', default=''): try: attr_value = element.get_attribute(attr_name) # 处理返回None的空单元格情况 return attr_value if attr_value is not None else default except Exception: # 捕获元素不存在、索引越界等异常 return default
然后修改循环代码,为每个字段单独调用这个函数:
# 不要用list作为变量名,避免覆盖Python内置类型 data_list = [] for i in range(10): data = { 'ID': safe_get_attr(IDs[i]), 'holder': safe_get_attr(holder[i]), 'view': safe_get_attr(view[i]), 'material': safe_get_attr(material[i]), 'Addons': safe_get_attr(addOns[i]), 'link': safe_get_attr(link[i], attr_name='href', default='无链接') } data_list.append(data)
方案2:按行遍历(更可靠的表格爬取方式)
如果你的IDs、holder等列表是通过find_elements分别获取的,可能存在列表长度不匹配的风险。更稳妥的方式是先遍历表格的每一行,再从行内提取对应单元格:
from selenium.webdriver.common.by import By data_list = [] # 获取表格所有行(根据实际HTML结构调整XPath,这里跳过表头) rows = driver.find_elements(By.XPATH, '//table//tr[position()>1]') for row in rows: # 从当前行提取各单元格 cells = row.find_elements(By.XPATH, './td') # 提取链接(假设链接在第6个单元格的<a>标签中) link_elem = row.find_elements(By.XPATH, './td[6]/a') data = { 'ID': safe_get_attr(cells[0]) if len(cells) >= 1 else '', 'holder': safe_get_attr(cells[1]) if len(cells) >= 2 else '', 'view': safe_get_attr(cells[2]) if len(cells) >= 3 else '', 'material': safe_get_attr(cells[3]) if len(cells) >= 4 else '', 'Addons': safe_get_attr(cells[4]) if len(cells) >= 5 else '', 'link': safe_get_attr(link_elem[0], attr_name='href', default='无链接') if link_elem else '' } data_list.append(data)
关键优化点
- 避免全局异常捕获:原代码的try-except包裹整个循环,一旦某一行的某个字段出错,循环直接终止,后续数据全部丢失。现在每个字段单独处理异常,不会影响整行和循环。
- 保证数据结构一致:每个字段都有默认值,不会出现字典键缺失的情况,避免后续数据处理(如转CSV、JSON)时出错。
- 兼容空单元格:自动处理
get_attribute返回None的空单元格场景,统一替换为默认值(可根据需求修改为"未知"等)。
内容的提问来源于stack exchange,提问作者Lilly
相关产品推荐
相关产品推荐

