使用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
解决方案
问题原因
- 元素定位不准确:
ytd-search-filter-renderer是多个筛选选项的共同类名,直接用find_element会选中第一个匹配项,大概率不是你需要的筛选条件;另外//*[@id="video-title"]定位的元素可能是广告或非视频条目,本身没有有效href属性。 - 等待方式不可靠:固定时长的
time.sleep无法保证页面元素完全加载,导致获取元素时href属性还未渲染。 - 单个元素匹配限制:
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
相关产品推荐
相关产品推荐

