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

使用Selenium按筛选条件提取YouTube视频链接返回None求助

问题:Selenium获取YouTube视频链接返回None

我想通过指定查询词和筛选条件解析YouTube视频链接列表,写了下面的Selenium代码:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
import time 

name = 'hello world'

driver = webdriver.Firefox()
driver.get('https://www.youtube.com')
id_serth = driver.find_element(By.NAME, "search_query")
id_serth.send_keys(name)
button_serth = driver.find_element(By.ID, "search-icon-legacy")
time.sleep(1)
button_serth.click()
time.sleep(3)
button_filtr = driver.find_element(By.CLASS_NAME ,"ytd-toggle-button-renderer")
button_filtr.click()
time.sleep(3)
button_filtrtode=driver.find_element(By.CLASS_NAME, "ytd-search-filter-renderer")
button_filtrtode.click()


#linkvideo2 = driver.find_element(By.ID, "video-title").get_attribute("href")
time.sleep(3)

urltek = driver.current_url

linkvideo2 = driver.find_element(By.XPATH, '//*[@id="video-title"]').get_attribute('href')


print (linkvideo2)
print (urltek)

运行后获取的视频链接返回None,结果如下:

None
https://www.youtube.com/results?search_query=hello+world&sp=EgIIAQ%253D%253D
解决方案

问题原因

  1. 元素定位不准确:ytd-search-filter-renderer是多个筛选选项的共同类名,直接用find_element会选中第一个匹配项,大概率不是你需要的筛选条件;另外//*[@id="video-title"]定位的元素可能是广告或非视频条目,本身没有有效href属性。
  2. 等待方式不可靠:固定时长的time.sleep无法保证页面元素完全加载,导致获取元素时href属性还未渲染。
  3. 单个元素匹配限制:find_element只返回第一个匹配元素,若该元素不是有效视频链接,就会返回None。

修改后的代码

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

name = 'hello world'

driver = webdriver.Firefox()
driver.get('https://www.youtube.com')

# 等待搜索框加载完成,输入关键词后按回车搜索
search_box = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.NAME, "search_query"))
)
search_box.send_keys(name)
search_box.send_keys(Keys.ENTER)

# 等待筛选按钮加载并点击
filter_btn = WebDriverWait(driver, 10).until(
    EC.element_to_be_clickable((By.XPATH, "//button[@aria-label='筛选']"))
)
filter_btn.click()

# 等待筛选选项加载,这里以点击「最新」为例,可根据需求修改文本内容
latest_filter = WebDriverWait(driver, 10).until(
    EC.element_to_be_clickable((By.XPATH, "//yt-formatted-string[text()='最新']"))
)
latest_filter.click()

# 等待视频列表加载,获取第一个带有效链接的视频标题
first_video_link = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.XPATH, "//a[@id='video-title' and @href]"))
).get_attribute('href')

# 如需获取所有视频链接,可替换为以下代码
# video_links = [elem.get_attribute('href') for elem in WebDriverWait(driver, 10).until(
#     EC.presence_of_all_elements_located((By.XPATH, "//a[@id='video-title' and @href]"))
# )]

print(first_video_link)
print(driver.current_url)

driver.quit()

关键修改点

  • 用显式等待替代time.sleep,确保元素加载完成后再执行操作,提升代码稳定性。
  • 精准定位筛选控件:通过aria-label定位筛选按钮,通过文本内容定位具体筛选选项,避免类名重复导致的定位错误。
  • 定位视频链接时增加@href条件,确保获取的是带有有效跳转链接的a标签。
  • 直接按回车触发搜索,简化搜索按钮的定位步骤。

内容的提问来源于stack exchange,提问作者Pivpav

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 02:45:44