在Python Selenium中获取span元素的首个<tr>祖先元素
解决从节点获取首个祖先节点的问题
你的核心问题是XPath未从目标元素出发做相对查找,导致匹配到了页面上无关的节点。以下是具体修正方案:
正确的XPath写法
针对目标元素,获取它的首个祖先有两种可靠方式:
基于祖先轴的相对查找(推荐,DOM结构变动时更稳定)
class_parent_tr = element_to_search.find_element(By.XPATH, "./ancestor::tr[1]")./指定从当前element_to_search(即目标)开始查找ancestor::tr匹配所有祖先节点[1]取距离当前元素最近的那个(也就是第一个祖先)
基于父节点层级跳转(适合结构固定的场景)
根据你描述的DOM结构:<span> → <div> → <td> → <tr>,可以直接向上跳转三级父节点:class_parent_tr = element_to_search.find_element(By.XPATH, "../../..")
修正其他代码问题
把硬编码的文本替换为变量,适配动态内容:
class_parent_tr_02 = element_to_search.find_element(By.XPATH, f"//tr[.//span[text()='{myList[1]}']]")修复最后一行获取的语法错误,同时用相对路径限定在当前范围内:
result = class_parent_tr.find_element(By.XPATH, "./td[6]")
完整修正后的代码片段
替换原代码中从driver.get("https://www.nba.com/stats/teams/traditional")开始的部分:
driver.get("https://www.nba.com/stats/teams/traditional") element_to_search = wait.until(EC.visibility_of_element_located((By.LINK_TEXT, myList[1]))) classes = element_to_search.find_element(By.XPATH, "./..") print("-works well") print(classes.get_attribute("class")) # 正确获取首个<tr>祖先 class_parent_tr = element_to_search.find_element(By.XPATH, "./ancestor::tr[1]") print("--") print(class_parent_tr.get_attribute("class")) # 用变量替代硬编码文本的写法 class_parent_tr_02 = element_to_search.find_element(By.XPATH, f"//tr[.//span[text()='{myList[1]}']]") print("---") print(class_parent_tr_02.get_attribute("class")) # 修正语法错误并使用相对路径获取<td> result = class_parent_tr.find_element(By.XPATH, "./td[6]") print(result.text) driver.quit()
内容的提问来源于stack exchange,提问作者xlmaster
相关产品推荐
相关产品推荐

