
本文详解如何用 Selenium 定位并提取 HTML 中 标签内的时间文本(如“9个月前”),纠正常见误区(如混淆 class="set" 与 class="time"),提供稳定、可复用的定位方案。
本文详解如何用 selenium 定位并提取 html 中 `
在使用 Selenium 抓取 Lichess 用户个人主页(如 https://lichess.org/@/username)的活跃时间信息时,开发者常误将元素的 class 名称当作 "time"(因标签为
正确做法是:优先依据实际 DOM 结构定位,而非标签名直译。观察目标 HTML(如截图所示),关键时间文本 "9 months ago" 位于
以下是优化后的可靠实现:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
import time
def get_player_activity(nick_hraca):
# 配置无头模式(推荐,避免窗口干扰)
chrome_options = Options()
chrome_options.add_argument("--headless")
chrome_options.add_argument("--no-sandbox")
chrome_options.add_argument("--disable-dev-shm-usage")
driver = webdriver.Chrome(options=chrome_options)
base_url = f"https://lichess.org/@/{nick_hraca}"
try:
driver.get(base_url)
driver.implicitly_wait(10) # 等待页面加载,比 sleep 更健壮
# ✅ 方案一:按 class="set" 精准定位(推荐,语义明确)
activity_elem = driver.find_element(By.CLASS_NAME, "set")
print("Last activity:", activity_elem.text) # 输出:e.g., "9 months ago"
# ✅ 方案二:按标签名定位(通用性强,适用于所有 <time> 元素)
# activity_elem = driver.find_element(By.TAG_NAME, "time")
# print("Last activity:", activity_elem.text)
# ✅ 方案三:XPath 精确路径(适合结构稳定场景)
# activity_elem = driver.find_element(By.XPATH, '//div[@id="us_profile"]//p[2]/time')
# print("Last activity:", activity_elem.text)
# 同时获取对局数链接文本(示例延展)
games_link = driver.find_element(By.XPATH, '//*[@id="main-wrap"]/main/div/div[5]/a[2]')
print("Games link text:", games_link.text)
except Exception as e:
print(f"Error occurred: {e}")
finally:
driver.quit()
# 调用示例
get_player_activity("magnuscarlsen")⚠️ 关键注意事项:
- ❌ 避免 get_attribute("set"):"set" 是 class 的值,不是可读属性;应使用 .text 获取可见文本。
- ❌ 避免硬编码过深 XPath(如 //*[@id="us_profile"]/div[2]/...):Lichess 页面结构可能更新,易失效;优先选用语义化定位(By.CLASS_NAME, By.TAG_NAME)或相对 XPath。
- ✅ 始终添加显式/隐式等待(如 implicitly_wait(10)),防止因页面未加载完成导致 NoSuchElementException。
- ✅ 使用 --headless 模式提升稳定性与执行效率,尤其在服务器环境运行时。
- ✅ 务必用 try/finally 或上下文管理器确保 driver.quit() 执行,防止残留进程。
总结:Selenium 定位的核心在于忠实还原 HTML 实际结构。看清元素的真实 class、标签和层级关系,比记忆“time 标签就该用 By.CLASS_NAME('time')”更重要。一次精准的 By.CLASS_NAME("set") + .text,即可优雅解决“9个月前”的提取需求。

















