行为单位抓取,再从中提取所需 | 或文本,逻辑更健壮;
强制显式等待(WebDriverWait),确保目标表格已存在于 DOM 中。
以下是兼容 Selenium 4.17+ 的推荐实现(find_element_by_* 已全面弃用): 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()
driver.get("https://www./link/7f5667890e56de28cb734293df7d2c73")
# 等待 roster 表格整体加载完成(比等待单个 td 更可靠)
wait = WebDriverWait(driver, 10)
wait.until(EC.presence_of_element_located((By.ID, "roster")))
# 定位 roster 表格的 所有数据行(排除 和空行)
players_rows = driver.find_elements(By.XPATH, "//table[@id='roster']/tbody/tr[.//td[@data-stat='player']]")
print(f"成功找到 {len(players_rows)} 名球员")
# 示例:提取每位球员姓名(位于 data-stat="player" 的 td 内)
for i, row in enumerate(players_rows[:3]): # 打印前3名验证
name_cell = row.find_element(By.XPATH, ".//td[@data-stat='player']")
print(f"{i+1}. {name_cell.text.strip()}")⚠️ 注意事项:
- 避免使用 time.sleep() 替代 WebDriverWait —— 效率低且不可靠;
- //table[@id='roster']/tbody/tr 默认包含表头行(
中无 data-stat),因此建议加过滤条件 [.//td[@data-stat='player']] 确保只取有效数据行; - 若需处理分页或懒加载内容,请额外检查是否存在“Show More”按钮并触发点击;
- 生产环境建议添加异常处理(如 TimeoutException, NoSuchElementException)提升鲁棒性。
通过结合精准 XPath + 显式等待 + 语义化元素层级选择,即可稳定获取动态表格中的完整球员列表,彻底规避“长度为 0”的陷阱。
|