Selenium异常处理未解决数据集混乱与空值填充异常问题
排查Selenium爬取Knowde数据字段混乱与null填充不一致的问题
可能的核心原因及排查方向
1. 元素定位器不唯一或依赖页面结构顺序
字段混乱最常见的原因是依赖索引(比如//div[@class='info']/div[2])或模糊定位器抓取元素,而部分产品的页面模块结构不一致(比如某字段缺失时,后续元素的索引会前移),导致抓取到错误内容。
- 排查:在浏览器控制台用定位器搜索,确认每个字段的定位器能精准匹配唯一元素,优先使用元素的专属属性(如
data-field="cas_number")代替索引定位。 - 示例:将
driver.find_element(By.XPATH, "//div[3]")替换为driver.find_element(By.XPATH, "//div[@data-field='cas_number']")
2. 页面加载时序未正确处理
即使部分字段能正常抓取,其余字段可能因动态渲染(滚动加载、JS异步加载)导致抓取时元素未加载完成,或已失效。
- 排查:对每个字段的抓取使用显式等待(
WebDriverWait),替代全局隐式等待:from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 等待目标元素加载完成 target_element = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.XPATH, "//div[@data-field='cas_number']")) ) field_value = target_element.text.strip() if target_element else 'null' - 额外检查:部分产品的字段需点击展开(如"更多信息"按钮)才会显示,确认该交互步骤未被遗漏。
3. 数据容器未在循环内重置
批量爬取时,若未在每个产品的循环开头重置存储字段的字典/列表,会导致上一条产品的残留数据污染当前字段。
- 排查:遍历每个产品前,初始化空的数据结构,确保字段默认值为
null:for product in product_list: # 每次循环新建空字典,避免数据残留 product_data = { 'brand': 'null', 'item': 'null', 'inci_name': 'null', 'function': 'null', # 其余字段默认设为null } # 逐个抓取字段并赋值 product_data['brand'] = driver.find_element(...).text.strip()
4. 异常处理逻辑不完整
仅捕获NoSuchElementException不足以覆盖所有场景,StaleElementReferenceException(元素失效)、TimeoutException(等待超时)等未处理的异常,会导致后续字段赋值混乱。
- 排查:对单个字段的抓取逻辑单独做异常捕获,避免用大的try-except包裹整个产品的抓取流程:
from selenium.common.exceptions import NoSuchElementException, StaleElementReferenceException try: product_data['cas_number'] = driver.find_element(By.XPATH, "//div[@data-field='cas_number']").text.strip() except (NoSuchElementException, StaleElementReferenceException): product_data['cas_number'] = 'null'
5. 字段内容解析错误
部分字段的文本包含换行、冗余空格,或页面中存在同名干扰元素(如侧边栏的相似产品字段),导致抓取到错误内容。
- 排查:抓取后打印原始文本,与页面实际内容对比;用JS脚本直接获取元素文本,避免Selenium的文本截取问题:
product_data['molecular_weight'] = driver.execute_script("return arguments[0].textContent;", mw_element).strip() if mw_element else 'null'
快速验证步骤
- 单独抓取一个产品的所有字段,打印每一步结果,对比页面内容定位错误起始字段。
- 检查错误字段的定位器是否匹配多个元素,或因产品结构差异导致定位失效。
- 给所有字段添加显式等待和单独异常捕获,重新测试单个产品的抓取结果。
内容的提问来源于stack exchange,提问作者kdavid3891
相关产品推荐
相关产品推荐

