如何在Selenium(Python)中遍历表格行并点击链接?
解决Selenium遍历点击元素时的AttributeError问题
嘿,我来帮你搞定这个问题!首先咱们先把错误原因说清楚:你用driver.find_elements_by_xpath()拿到的table是一个元素列表,而列表本身没有find_element_by_xpath这个方法,这就是你报错的直接原因。另外还有个容易踩坑的点:你写的xpath是绝对路径(没有.前缀),就算你能遍历table,每次也会找到页面上第一个符合条件的元素,而不是当前table下面的子元素。
下面是修正后的代码,我把所有需要注意的点都标出来了:
import time from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC driver = webdriver.Firefox() url = 'here://code.above.com/' driver.get(url) # 先等页面加载完,确保目标元素都出来了,避免找不到元素的问题 wait = WebDriverWait(driver, 10) tables = wait.until(EC.presence_of_all_elements_located((By.XPATH, "//table[@class='foot-market']"))) # 遍历每个table for table in tables: # 重点:用.开头的相对xpath,只在当前table下找tbody tbodies = table.find_elements(By.XPATH, ".//tbody[@data-live='false']") for tbody in tbodies: # 同样用相对xpath找当前tbody下的可点击td td_element = tbody.find_element(By.XPATH, ".//td[@class='today-name']") td_element.click() # 点击后等页面跳转完成,再返回上一页 time.sleep(2) # 这里也可以用WebDriverWait等特定元素,比硬等更靠谱 driver.back() # 返回后要等页面重新加载好,不然下一次找元素会出错 wait.until(EC.presence_of_all_elements_located((By.XPATH, "//table[@class='foot-market']"))) # 如果只是测试第一个table,取消下面的注释就行 # break driver.quit()
几个关键的改进细节:
- 相对路径xpath:一定要在xpath前面加
.,意思是“从当前元素的子节点开始找”,这样才能精准定位到当前表格/tbody下面的元素,不会每次都去页面最开头找第一个匹配的元素。 - 弃用API替换:
find_elements_by_xpath这类旧API已经被Selenium弃用了,现在推荐用find_elements(By.XPATH, ...)的写法,兼容性更好。 - 显式等待:用
WebDriverWait代替单纯的time.sleep(),可以更智能地等待元素加载完成,避免因网络慢或页面渲染慢导致的报错。 - 遍历逻辑修正:先遍历所有table,再遍历每个table下的tbody,最后找到对应的可点击td,点击后返回并重新等待页面加载,确保后续操作正常。
如果还有其他问题,比如点击后页面跳转异常,或者元素找不到,都可以再调整等待逻辑或者xpath哦~
内容的提问来源于stack exchange,提问作者Cave Man
相关产品推荐
相关产品推荐

