Selenium通过Class定位元素失败:获取推特回复用户名遇阻
问题解决:Selenium无法获取推特回复用户名
核心错误点
By.CLASS_NAME仅支持单个类名,你传入的是多个空格分隔的类名,Selenium会直接匹配失败,这是返回空列表的主要原因。- 推特的类名是动态生成的,随时可能变化,依赖多类名定位的稳定性极差。
- 回复内容是动态加载的,仅靠隐式等待无法覆盖滚动加载的场景。
修复方案
1. 替换定位方式并处理动态加载
改用CSS选择器定位(支持多类名组合),同时模拟滚动加载所有回复,确保能获取完整的用户列表:
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 import time driver = webdriver.Chrome() driver.get("https://twitter.com/JustYGami/status/1637949323651723264") # 滚动加载所有回复 scroll_pause_time = 2 last_height = driver.execute_script("return document.body.scrollHeight") while True: driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") time.sleep(scroll_pause_time) new_height = driver.execute_script("return document.body.scrollHeight") if new_height == last_height: break last_height = new_height # 用稳定的CSS选择器定位回复中的用户链接 wait = WebDriverWait(driver, 15) user_links = wait.until(EC.presence_of_all_elements_located( (By.CSS_SELECTOR, 'div[data-testid="tweet"] a[href^="/"][href*="/status/"]:not([href*="/retweets/"]):not([href*="/likes/"])') )) # 提取并去重用户名 user_list = [link.get_attribute('href').split('/')[3] for link in user_links] unique_users = list(set(user_list)) print(unique_users) driver.quit()
2. 关键优化说明
- 用
WebDriverWait显式等待,比隐式等待更精准,确保元素完全加载后再定位。 - 模拟滚动加载,解决推特回复分批加载的问题,避免只获取顶部少量内容。
- 依赖
data-testid="tweet"这个静态属性定位回复容器,比动态类名更稳定。 - 对用户名去重,避免重复记录同一用户的多次回复。
内容的提问来源于stack exchange,提问作者meow
相关产品推荐
相关产品推荐

