You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何用BeautifulSoup在单个变量存储多组文本?Python歌词爬取存值遇阻

Hey Hugo,我看到你已经搞定了遍历歌曲URL和打印内容的部分,这已经迈出一大步啦!没法把所有歌词存到单个变量里确实挺挠头的,我来帮你捋捋可能的问题和解决办法~

核心问题排查:变量初始化与追加逻辑

大概率是你把存储变量的初始化放在了循环内部,导致每次循环都会清空之前的内容;或者是追加内容的方式不对。咱们直接上可落地的解决方案:

方案1:用列表存储所有歌词文本(最简便)

把存储列表初始化在循环外面,每次爬完一首歌就把歌词追加进去,最后还能合并成单个字符串变量:

import requests
from bs4 import BeautifulSoup

# 关键:把存储变量放在循环外面,避免每次循环重置
all_lyrics = []

# 假设你已经整理好歌手所有歌曲的URL列表
song_urls = ["https://example.com/song1", "https://example.com/song2", ...]

for url in song_urls:
    # 你已经实现的单歌爬取逻辑
    response = requests.get(url)
    soup = BeautifulSoup(response.text, "html.parser")
    # 替换成你实际提取歌词的选择器
    song_lyrics = soup.select_one(".lyrics-container").get_text(strip=True)
    
    # 把当前歌词追加到总列表
    all_lyrics.append(song_lyrics)

# 若需要合并成单个字符串(用分隔符区分不同歌曲)
combined_lyrics = "\n\n=== 分割线 ===\n\n".join(all_lyrics)
# 现在combined_lyrics就是所有歌词的集合变量啦
print(combined_lyrics)

方案2:用列表嵌套字典存储(保留歌名+歌词对应关系)

如果想同时保存歌名和歌词,这种结构更清晰,后续处理也方便:

all_song_info = []

for url in song_urls:
    response = requests.get(url)
    soup = BeautifulSoup(response.text, "html.parser")
    
    # 提取歌名(替换成你实际的选择器)
    song_title = soup.select_one(".song-title").get_text(strip=True)
    song_lyrics = soup.select_one(".lyrics-container").get_text(strip=True)
    
    # 打包成字典后追加到列表
    all_song_info.append({
        "title": song_title,
        "lyrics": song_lyrics
    })

# 验证结果
for song in all_song_info:
    print(f"【{song['title']}】\n{song['lyrics']}\n")

常见坑点排查

  • 变量初始化位置错误:绝对不能把all_lyrics = []放在for循环里,不然每次循环都会重置列表,最后只剩最后一首歌的内容。
  • 歌词提取为空:有时候网页结构可能有差异,导致提取的歌词是空字符串,可以加个判断避免无效数据:
    if song_lyrics:
        all_lyrics.append(song_lyrics)
    else:
        print(f"⚠️ 注意:{url} 无法提取到歌词")
    
  • 追加方法用错:列表追加要用append(),如果是字典不要直接赋值覆盖,而是把新字典加入列表。

按照这个思路调整你的代码,应该就能顺利把所有歌词存到单个变量里啦!

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

火山引擎 最新活动