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

BeautifulSoup按class查找AllMusic页面元素返回空列表如何解决

问题解决方法

你遇到的问题有三个常见诱因,对应解决方法如下:

  • 第一:请求未携带浏览器标识,被站点反爬策略拦截,返回的不是正常搜索结果页面
    解决方法:发送请求时补充User-Agent请求头模拟浏览器访问,同时URL中的特殊字符需要提前编码,不要直接在URL中写入双引号,修改后的请求代码如下:
    import requests
    from bs4 import BeautifulSoup
    
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"
    }
    # 使用编码后的URL,%22对应双引号
    url = "https://www.allmusic.com/search/songs/%22hola%22"
    results = requests.get(url, headers=headers)
    # 可先打印状态码和返回内容前500字符,确认返回的是正常搜索页面
    print(results.status_code)
    print(results.text[:500])
    soup = BeautifulSoup(results.text, 'html.parser')
    print(soup.find_all("li", class_="song"))
    
  • 第二:默认解析器适配性不足
    如果补充请求头后仍然返回空列表,可以将解析器替换为容错性更高的lxml,需要先执行pip install lxml安装依赖,再修改解析代码为:
    soup = BeautifulSoup(results.text, 'lxml')
    
  • 第三:页面内容为前端动态渲染
    若上述方法都无效,说明搜索结果是通过JavaScript动态加载的,直接请求原始HTML不会包含目标元素,此时可以使用Selenium等自动化工具模拟浏览器加载完整页面后再解析:
    from selenium import webdriver
    from bs4 import BeautifulSoup
    
    driver = webdriver.Chrome()
    driver.get("https://www.allmusic.com/search/songs/%22hola%22")
    # 等待页面加载完成
    driver.implicitly_wait(10)
    page_source = driver.page_source
    soup = BeautifulSoup(page_source, 'lxml')
    print(soup.find_all("li", class_="song"))
    driver.quit()
    

注意:爬取站点内容时请控制请求频率,遵守站点的robots协议规则,避免对站点服务造成影响。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 15:36:03