You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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()
问题原因

代码存在两个核心逻辑漏洞:

  1. 元素定位范围过宽:XPath//*[@id="video-title"]会全局匹配页面所有id为video-title的元素,包括首页加载完成后就存在的推荐视频元素。WebDriverWait只要检测到任意一个匹配元素存在就会返回结果,不会等待搜索结果加载完成,因此直接拿到了首页的视频元素。
  2. 等待条件不可靠:使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 10:45:33