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
相关产品推荐
相关产品推荐

