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

Selenium WebDriver未等待页面加载,Youtube转MP3脚本链接错误求助

Hey there, let's get your YouTube to MP3 downloader working correctly! The core problem here is that your current code relies on a global implicit wait, which isn't reliable for ensuring specific elements (like search results) are fully loaded before you interact with them. Instead, we'll use explicit waits to target exactly when we can safely grab the search result link.

Here's the breakdown of what needs to change:

  1. Import Selenium's WebDriverWait and expected_conditions modules to wait for specific element states (like clickable, visible).
  2. Replace the implicit wait with targeted explicit waits for each critical step, so we don't accidentally pull the homepage's first video link.
  3. Tweak some element selectors to be more robust (YouTube occasionally updates its page structure, so IDs are more reliable than class names).

Modified Working Code

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

print("Automated Youtube to MP3 downloader")
artist = input("Enter Artist Name: ")
song = input("Enter Song Name: ")
choice = input("Play or Download: ")
choice = choice.lower()

if choice == 'download':
    driver = webdriver.Chrome()
    # Ditch the implicit wait - explicit waits give us better control
    driver.get('https://www.youtube.com')

    # Wait for the search box to be clickable before typing
    search_box = WebDriverWait(driver, 25).until(
        EC.element_to_be_clickable((By.ID, "search"))
    )
    search_box.send_keys(f"{artist}-{song}")

    # Wait for the search icon to be ready before clicking
    search_button = WebDriverWait(driver, 25).until(
        EC.element_to_be_clickable((By.ID, "search-icon-legacy"))
    )
    search_button.click()

    # Wait for the first search result's video title to be visible, then grab its link
    first_video_link = WebDriverWait(driver, 25).until(
        EC.visibility_of_element_located((By.XPATH, "//a[@id='video-title']"))
    )
    href = first_video_link.get_attribute('href')

    # Proceed with YTMP3 conversion, using explicit waits here too
    driver.get('https://ytmp3.cc/en13/')
    link_holder = WebDriverWait(driver, 25).until(
        EC.presence_of_element_located((By.ID, "input"))
    )
    link_holder.send_keys(href)

    convert_button = WebDriverWait(driver, 25).until(
        EC.element_to_be_clickable((By.ID, "submit"))
    )
    convert_button.click()

    # Wait for the download link to be available before clicking
    download_link = WebDriverWait(driver, 25).until(
        EC.element_to_be_clickable((By.CSS_SELECTOR, "a[href^='https://']"))
    )
    download_link.click()
else:
    print('To code for play option')

Key Improvements:

  • Explicit Waits: Each step waits for the exact element we need to be in a usable state (clickable, visible) before acting. This eliminates the race condition where your code tried to grab a link before search results loaded.
  • Robust Selectors: We use By.ID for the search box and button (more stable than class names, which YouTube often changes) and a precise XPath for the video title link.
  • No Mixed Waits: Implicit and explicit waits can conflict, so we stick to explicit waits for full control over when interactions happen.

Extra Tips:

  • Ensure your ChromeDriver version matches your installed Chrome browser version—mismatches can cause unexpected errors.
  • If YouTube updates its page structure later, inspect the page to find new IDs/XPaths for elements you're targeting.

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 15:37:30