Python Selenium搜索YouTube后无法正确获取搜索结果首个视频标题
问题描述
学习Selenium使用过程中,计划编写自动化程序实现以下功能:
- 打开YouTube网站
- 搜索指定关键词视频
- 打印搜索结果列表中第一个视频的标题
程序实际运行时输出的是YouTube首页的第一个视频标题,并非搜索结果对应的视频标题,问题复现代码如下:
from logging import exception from selenium import webdriver from selenium.webdriver.common.keys import Keys 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 PATH = 'C:\\Program Files (x86)\\chromedriver.exe' driver = webdriver.Chrome(PATH) driver.get("https://www.youtube.com/") search = driver.find_element(By.CSS_SELECTOR, 'input#search') search.send_keys("busqueda") time.sleep(1) search.send_keys(Keys.RETURN) time.sleep(5) try: element = WebDriverWait(driver,10).until(EC.presence_of_element_located((By.XPATH, '//*[@id="video-title"]'))) print("título: ", element.get_attribute("innerHTML")) except BaseException as e: print(e) finally: driver.quit()
问题原因
代码存在两个核心逻辑漏洞:
- 元素定位范围过宽:XPath
//*[@id="video-title"]会全局匹配页面所有id为video-title的元素,包括首页加载完成后就存在的推荐视频元素。WebDriverWait只要检测到任意一个匹配元素存在就会返回结果,不会等待搜索结果加载完成,因此直接拿到了首页的视频元素。 - 等待条件不可靠:使用
presence_of_element_located仅判断元素存在于DOM树中,不校验元素是否可见、是否属于当前激活的页面区域;硬编码的time.sleep()等待时长固定,无法适配不同网络速度下的页面加载节奏,既可能等太久拖慢执行效率,也可能在搜索结果未完全加载、首页元素未被替换时就执行查找逻辑。
修复方案
针对以上问题做对应调整即可:
- 移除冗余的硬编码
time.sleep,全部替换为显式等待,兼顾执行效率和稳定性 - 增加搜索结果页跳转校验,确认URL携带搜索参数后再执行元素查找
- 缩小元素定位范围,限定在搜索结果容器内查找视频标题,避免匹配首页残留元素
- 将元素等待条件替换为
visibility_of_element_located,确保拿到的是用户当前可见的搜索结果内容 - 改用
.text属性获取标题文本,避免innerHTML携带多余HTML标签导致输出内容混乱
修复后可正常运行的代码如下:
from selenium import webdriver from selenium.webdriver.common.keys import Keys from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC PATH = 'C:\\Program Files (x86)\\chromedriver.exe' driver = webdriver.Chrome(PATH) driver.get("https://www.youtube.com/") # 等待搜索框加载完成后输入关键词 search = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.CSS_SELECTOR, 'input#search')) ) search.send_keys("busqueda") search.send_keys(Keys.RETURN) try: # 等待页面跳转到搜索结果路由 WebDriverWait(driver, 10).until(EC.url_contains("search_query")) # 在搜索结果条目容器内查找第一个可见的视频标题元素 first_video_title = WebDriverWait(driver, 10).until( EC.visibility_of_element_located((By.XPATH, '//ytd-item-section-renderer//*[@id="video-title"]')) ) # 提取标题可见文本并去除首尾空白字符 print("título: ", first_video_title.text.strip()) except BaseException as e: print(e) finally: driver.quit()
内容的提问来源于stack exchange,提问作者Desconocido
相关产品推荐
相关产品推荐

