Selenium遍历表格行爬取RealGM球员数据遇加载及点击问题求助
问题排查与修正方案
原代码核心问题
- 多类名定位错误:
By.CLASS_NAME不支持空格分隔的多个类名,原代码里的'nowrap tablesaw-cell-persist'会导致定位失败。 - 未过滤无效行:通过
By.TAG_NAME, 'tr'获取的所有行包含表头、分页栏等非数据行,这些行里没有球员链接,会引发找不到元素的错误,导致流程卡住。 - 元素操作逻辑错误:
get_attribute('href')返回的是字符串,不能直接调用.click(),必须先定位到链接元素再执行点击。 - 页面返回后元素失效:循环中调用
driver.back()回到列表页后,之前获取的rows列表会变成「过时元素」,后续循环无法正常执行。
修正后的代码
import pandas as pd from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 初始化浏览器 driver = webdriver.Chrome() wait = WebDriverWait(driver, 10) # 显式等待,最长10秒 url = 'https://basketball.realgm.com/international/league/4/Spanish-ACB/stats/2024/Averages/Qualified/All/points/PG/desc/1/Regular_Season' driver.get(url) # 存储球员数据的列表 player_data = [] try: # 定位所有数据行(排除表头,只取包含球员链接的行) data_rows = wait.until(EC.presence_of_all_elements_located( (By.CSS_SELECTOR, 'tr[class^="row"]') # 数据行的class以row开头 )) for index, _ in enumerate(data_rows): # 重新定位当前行(避免循环中元素失效) current_row = wait.until(EC.presence_of_element_located( (By.CSS_SELECTOR, f'tr.row-{index}') )) # 定位球员链接(用CSS_SELECTOR处理多类名) player_link = current_row.find_element(By.CSS_SELECTOR, '.nowrap.tablesaw-cell-persist a') # 打开新标签页访问球员详情,避免返回列表页导致元素失效 player_link.send_keys(Keys.CONTROL + Keys.ENTER) driver.switch_to.window(driver.window_handles[1]) # 等待详情页加载,获取所需数据 try: # 获取身高、体重、年龄 height = wait.until(EC.presence_of_element_located( (By.XPATH, '//div[@class="player-info-box"]/span[following-sibling::strong[text()="Height"]]') )).text.strip() weight = wait.until(EC.presence_of_element_located( (By.XPATH, '//div[@class="player-info-box"]/span[following-sibling::strong[text()="Weight"]]') )).text.strip() age = wait.until(EC.presence_of_element_located( (By.XPATH, '//div[@class="player-info-box"]/span[following-sibling::strong[text()="Age"]]') )).text.strip() # 获取球员图片URL player_img = wait.until(EC.presence_of_element_located( (By.CSS_SELECTOR, 'div.player-headshot img') )).get_attribute('src') # 存入数据列表 player_data.append({ 'Height': height, 'Weight': weight, 'Age': age, 'Image URL': player_img }) except Exception as e: print(f"获取球员数据失败: {str(e)}") # 关闭当前详情页,切回列表页 driver.close() driver.switch_to.window(driver.window_handles[0]) finally: driver.quit() # 将数据转为DataFrame并保存(可选) df = pd.DataFrame(player_data) print(df) df.to_csv('acb_players_data.csv', index=False)
关键改进点
- 用CSS_SELECTOR定位多类名元素:
.nowrap.tablesaw-cell-persist可以正确匹配同时拥有这两个类的元素。 - 显式等待替代隐式等待:
WebDriverWait配合expected_conditions可以更精准地等待元素加载,避免页面未加载完成就执行操作导致的加载卡住问题。 - 新标签页打开详情页:避免返回列表页导致的元素失效问题,提升流程稳定性。
- 过滤有效数据行:通过
tr[class^="row"]只定位包含球员数据的行,跳过表头和其他无效行。
内容的提问来源于stack exchange,提问作者B. Pandey
相关产品推荐
相关产品推荐

