You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Selenium中如何在For循环中仅按偶数索引遍历XPATH并优雅处理

问题分析与解决方案

你的循环只执行4次的核心原因是range的结束值用错了:你把有效方案的数量len(alternative_solutions)作为range的上限,但XPATH里的tr[{}]是表格的行索引(从1开始),两者完全不匹配。比如假设你有10个有效方案,对应表格的2、4...20行,而range(2,10,2)只会生成2、4、6、8这4个索引,自然只执行4次。

优雅的解决方案(推荐)

既然你已经通过By.CLASS_NAME, "flight-row"定位到了所有有效行,完全不需要再用XPATH硬编码行索引,直接遍历这些元素即可,代码更简洁且稳定:

alternative_solutions = driver.find_elements(By.CLASS_NAME, "flight-row")
positive(f"Total number of Alternative options found are {len(alternative_solutions)}")

# 直接遍历已定位的有效行元素
for flight_row in alternative_solutions:
    # 在当前行内定位td[2],避免全局XPATH的不稳定
    flight_number = WebDriverWait(flight_row, 20).until(
        EC.presence_of_element_located((By.XPATH, "./td[2]"))
    ).text
    # 这里添加对flight_number的后续处理逻辑

这种方式的优势:

  • 不依赖表格的行索引顺序,即使页面结构微调(比如插入新的空行),代码依然能正常工作
  • 代码逻辑更直观,减少索引计算的错误
  • 定位范围更小,元素查找效率更高

若坚持使用原XPATH方式(不推荐)

如果一定要保留基于行索引的定位方式,需要根据有效方案的数量生成对应的偶数行索引:

alternative_solutions = driver.find_elements(By.CLASS_NAME, "flight-row")
positive(f"Total number of Alternative options found are {len(alternative_solutions)}")

# 第n个有效方案对应表格的2*n行(n从1开始)
for idx in range(len(alternative_solutions)):
    tr_index = 2 * (idx + 1)
    flight_number = WebDriverWait(driver, 20).until(
        EC.presence_of_element_located((By.XPATH, f"//hgb-alternative-flights[1]/div[2]/div[1]/div[1]/div[1]/table[1]/tr[{tr_index}]/td[2]"))
    ).text
    # 后续处理逻辑

或者直接生成正确的偶数序列:

# 生成2、4、...、2*len(alternative_solutions)的序列
for tr_index in range(2, 2*len(alternative_solutions)+1, 2):
    flight_number = WebDriverWait(driver, 20).until(
        EC.presence_of_element_located((By.XPATH, f"//hgb-alternative-flights[1]/div[2]/div[1]/div[1]/div[1]/table[1]/tr[{tr_index}]/td[2]"))
    ).text
    # 后续处理逻辑

内容的提问来源于stack exchange,提问作者Rustom Contractor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 22:06:34