Python Selenium中get_attribute()方法报错及获取指定<tr>下第6个<td>元素的问题
解决Selenium get_attribute报错及获取目标内容的方案
先聊聊报错的根源
你碰到的Did you mean 'getattribute'错误,本质是两个基础用法错误导致的:
- 错误使用
element.parent:Python Selenium的WebElement对象并没有parent属性用来直接获取父元素,用这个方式拿到的不是有效的WebElement实例,自然没法调用get_attribute()方法。 - XPATH定位语法错误:你写的
element_to_search.find_element(By.XPATH(".."))是错的,By.XPATH是By类下的常量属性,正确调用格式是find_element(By.XPATH, "..")——要把定位方式和表达式作为两个独立参数传入,而非把By.XPATH当函数调用。
实现核心需求的具体方案
你的目标是:定位球队名称所在的 → 找到所属的 → 获取该下第6个的内容。这里给你两种实现方式,按需选择:
方式1:简洁链式定位
直接从球队名称元素出发,用XPATH一步定位到目标:
# 定位到球队名称元素后,直接获取目标<td> target_td = element_to_search.find_element(By.XPATH, "./../td[6]") # 打印目标内容 print(target_td.text)
./代表当前元素(球队名称所在的)../代表它的直接父元素()td[6]代表下的第6个(XPATH索引从1开始计数)
方式2:分步定位(便于调试)
如果需要分步验证每一步的元素是否正确,可以拆分步骤:
# 1. 正确获取球队<td>的父元素<tr> parent_tr = element_to_search.find_element(By.XPATH, "..") # 验证父元素:打印它的class属性(现在不会报错了) print(parent_tr.get_attribute("class")) # 2. 在<tr>下找到第6个<td> target_td = parent_tr.find_element(By.XPATH, "./td[6]") # 输出目标内容 print(target_td.text)
修正后的完整代码
把你原代码中出错的部分替换,完整代码如下:
import time from selenium import webdriver from selenium.webdriver.common.by import By from datetime import datetime driver = webdriver.Chrome(r"C:\Users\Admin\Downloads\chromedriver_win32 (1)\chromedriver.exe") driver.get("https://www.nba.com/schedule?pd=false®ion=1") driver.implicitly_wait(5) # 同意隐私政策 element_to_click = driver.find_element(By.ID, "onetrust-accept-btn-handler") element_to_click.click() # 获取球队列表并写入文件 element_to_save = driver.find_element(By.XPATH, "//div/div/div/div/h4") f = open('result_file00.txt', 'w+') # 用w+避免文件残留旧内容 f.write(element_to_save.text) f.write("\n") f.write(str(datetime.today())) myList = [] myList.append(1) elements_to_save = driver.find_elements(By.XPATH, "//*[@data-id='nba:schedule:main:team:link']") for element in elements_to_save: f.write(" ") f.write(element.text) myList.append(element.text) f.write(" \n ") f.write(str(datetime.today())) f.close() # 读取并打印文件内容 f = open('result_file00.txt', 'r+') print(f.read()) f.close() print(myList) print(type(myList)) # 跳转到球队数据页面 time.sleep(1) driver.get("https://www.nba.com/stats/teams/traditional") driver.implicitly_wait(5) # 页面跳转后加等待,确保元素加载完成 # 定位到第一个球队名称元素 element_to_search = driver.find_element(By.LINK_TEXT, myList[1]) # --- 核心修正部分 --- # 方式1:直接获取目标内容 target_td = element_to_search.find_element(By.XPATH, "./../td[6]") print("目标内容:", target_td.text) # 若需要分步验证,可替换为方式2 # parent_tr = element_to_search.find_element(By.XPATH, "..") # print("父元素class:", parent_tr.get_attribute("class")) # target_td = parent_tr.find_element(By.XPATH, "./td[6]") # print("目标内容:", target_td.text) driver.quit()
额外小提示
- 页面跳转后建议加隐式等待或显式等待,避免因页面未加载完成出现元素找不到的问题。
- 如果
By.LINK_TEXT定位失败,可尝试By.PARTIAL_LINK_TEXT或XPATH定位,比如//a[text()='{}']".format(myList[1])。
内容的提问来源于stack exchange,提问作者xlmaster
相关产品推荐
相关产品推荐

