通过XPath按表头名称获取单元格值时出现NoSuchElementException
解决方法
你的XPath逻辑有误,表头的th和目标行的td不在同一层级,原写法直接在目标行的td里查找th,自然找不到元素。正确思路是先确定「Adjusted Amount」对应的列位置,再结合行索引定位目标单元格。
步骤1:获取目标列的索引
先定位表头中「Adjusted Amount」的th元素,计算它在表头里的列序号(XPath索引从1开始):
# 获取表头行的所有th元素 header_th = driver.find_elements(By.XPATH, "//form[2]/table/tbody/tr/td/table/tbody/tr[1]/th") # 遍历找到目标列的索引 target_col_index = None for index, th in enumerate(header_th, start=1): if th.text.strip() == "Adjusted Amount": target_col_index = index break
步骤2:结合行索引定位目标input
拿到列索引后,直接用行索引+列索引定位对应单元格里的input:
if target_col_index: # 这里行索引用你需要的2,也可替换成变量 input_element = driver.find_element(By.XPATH, f"//form[2]/table/tbody/tr/td/table/tbody/tr[2]/td[{target_col_index}]/input") adjusted_amount = input_element.get_attribute('value') print(adjusted_amount)
简化版XPath(一步到位)
也可以用XPath的count函数直接计算列索引,无需单独遍历:
adjusted_amount = driver.find_element(By.XPATH, f"//form[2]/table/tbody/tr/td/table/tbody/tr[2]/td[count(//form[2]/table/tbody/tr/td/table/tbody/tr[1]/th[text()='Adjusted Amount']/preceding-sibling::th) + 1]/input").get_attribute('value')
这个XPath的逻辑是:用count(preceding-sibling::th)计算目标th前面的同级th数量,加1得到它的列索引,再用该索引定位目标行的td。
额外注意:
- 确保页面元素已加载完成,必要时添加等待(比如
WebDriverWait),避免因元素未加载导致找不到的异常。 - 核对
form[2]是否为正确的表单索引,页面结构可能和预期有偏差。
内容的提问来源于stack exchange,提问作者Arthur Langlois
相关产品推荐
相关产品推荐

