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

使用BeautifulSoup爬取歌词失败,疑因<br>标签,求解决方案及XPath可行性

解决无法用BeautifulSoup提取musica.com歌词的问题

我来帮你一步步拆解问题、找到解决方案:

为什么歌词没出现在soup对象里?

你遇到的核心问题大概率不是<br>标签,而是页面内容是JavaScript动态加载的。requests.get(url)只能获取服务器返回的初始HTML代码,而很多现代网站会用JS在页面加载完成后再渲染歌词这类内容,这部分动态生成的代码不会被requests抓取到,自然也不会出现在BeautifulSoup解析的soup对象里。

你可以手动验证这一点:打开目标网址,右键查看「页面源代码」,搜索歌词里的任意一句,大概率找不到——但如果用浏览器的「检查元素」(F12)查看DOM,就能看到歌词内容,这就说明歌词是JS动态加载的。

能不能用BeautifulSoup获取歌词?

当然可以,但前提是先拿到包含歌词的完整渲染后HTML。你需要用能执行JavaScript的工具(比如Selenium或Playwright)先让浏览器把页面渲染完成,再获取页面源码,最后用BeautifulSoup解析。

给你一个可行的代码示例(用Selenium):

from bs4 import BeautifulSoup
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.musica.com/letras.asp?letra=113"

# 初始化Chrome浏览器(需要提前安装对应版本的chromedriver)
driver = webdriver.Chrome()
driver.get(url)

# 等待歌词容器加载完成(这里假设歌词在class为'letra'的容器里,你可以用F12确认实际元素)
wait = WebDriverWait(driver, 10)
wait.until(EC.presence_of_element_located((By.CLASS_NAME, 'letra')))

# 获取渲染后的完整页面源码
page_source = driver.page_source
driver.quit()

# 用BeautifulSoup解析并提取歌词
soup = BeautifulSoup(page_source, 'html5lib')
lyrics = soup.find(class_='letra').get_text(separator='\n')
print(lyrics)

这段代码先让浏览器加载并渲染页面,确保歌词已经生成,再获取源码交给BeautifulSoup处理,就能顺利提取歌词了。

XPath是不是最佳替代方案?

XPath不是「替代方案」,而是和BeautifulSoup选择器互补的定位工具:

  • 如果用Selenium/Playwright这类渲染工具,你可以直接用XPath定位歌词元素,不用再转BeautifulSoup,比如:
    # 直接用XPath获取歌词文本
    lyrics_text = wait.until(EC.presence_of_element_located((By.XPATH, '//div[@class="letra"]'))).text
    print(lyrics_text)
    
  • 如果是静态HTML场景,BeautifulSoup的find/find_all方法足够灵活,不需要用XPath。

所以没有「最佳」一说,完全看你的使用习惯和场景:如果你喜欢BeautifulSoup的API,渲染后解析就好;如果你熟悉XPath,直接用它定位元素也很高效。

最后提醒一句:爬取前记得查看网站的robots.txt和使用条款,确保你的爬取行为是合规的。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 10:13:56