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

使用lxml库网页爬取时tree.xpath()返回空列表问题求助

解决YouTube趋势页音乐按钮href提取为空的问题

嘿,我来帮你搞定这个问题!你遇到的返回空列表的情况,主要有两个核心原因:

1. 页面是动态渲染的,静态HTML里没有目标元素

YouTube的页面内容(包括你要找的音乐、游戏、影视按钮)是通过JavaScript动态生成的。urllib.request.urlopen只能获取服务器返回的初始静态HTML,这时候那些按钮还没被渲染出来,自然找不到对应的<a>标签。

2. 原XPath路径依赖不稳定的DOM结构

你写的XPath是基于动态渲染后的DOM节点层级,但YouTube的页面结构经常会更新,而且静态HTML里根本不存在ytd-channel-list-sub-menu-avatar-renderer这类自定义组件,所以这个路径从一开始就没法匹配到任何元素。

靠谱的解决方案:使用支持JS渲染的工具

要获取动态加载的内容,我们需要用能模拟浏览器运行JS的工具,比如Selenium或者Playwright,下面给你两种可行的实现方式:

方式一:用Selenium(需要浏览器驱动)

首先安装依赖:

pip install selenium

然后下载对应浏览器的驱动(比如ChromeDriver,要和你的浏览器版本匹配),把驱动放到系统PATH里或者在代码中指定路径。

代码示例:

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

url = "https://www.youtube.com/feed/trending"
# 如果驱动不在PATH里,添加executable_path参数,比如executable_path="chromedriver.exe"
driver = webdriver.Chrome()
driver.get(url)

try:
    # 等待音乐按钮加载完成,最多等10秒;用href参数匹配比DOM路径更稳定
    music_link = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.XPATH, '//a[contains(@href, "/feed/trending?bp=6gQJRkVleHBsb3Jl")]'))
    )
    print("音乐按钮的href值:", music_link.get_attribute('href'))
finally:
    # 不管成功失败都关闭浏览器
    driver.quit()

方式二:用Playwright(无需手动装驱动)

Playwright是更现代的自动化工具,自带浏览器驱动管理,使用起来更省心:

先安装依赖和浏览器:

pip install playwright
playwright install chrome

代码示例:

from playwright.sync_api import sync_playwright

url = "https://www.youtube.com/feed/trending"

with sync_playwright() as p:
    # 启动浏览器(headless=True可以后台运行)
    browser = p.chromium.launch(headless=False)
    page = browser.new_page()
    page.goto(url)
    
    # 等待音乐按钮元素出现,用href包含指定参数来定位
    music_link = page.wait_for_selector('a[href*="/feed/trending?bp=6gQJRkVleHBsb3Jl"]')
    print("音乐按钮的href值:", music_link.get_attribute('href'))
    
    browser.close()

额外提示

  • 用href参数匹配比硬写DOM层级更可靠:YouTube的筛选参数(比如bp=6gQJRkVleHBsb3Jl对应音乐分类)很少变动,而DOM节点的类名、层级经常会更新。
  • 注意反爬:频繁请求可能会被YouTube限制,建议添加适当的等待时间,不要过于频繁爬取。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 16:27:44