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

如何从爬取的Billboard榜单长字符串中提取歌曲名子串

提取方案选择

优先用位置特征提取的思路,比大写匹配的稳定性高很多。你拿到的单年数据本身是标准逗号分隔的结构化文本,按分隔符位置取内容的逻辑不容易出错;全大写匹配的方案容错性极差,一旦碰到带非大写字符、特殊标点的歌曲名就会漏抓或者错抓,只适合完全丢失结构化分隔符的场景兜底用。

具体实现逻辑

  • 先把单年的原始多行文本按换行符拆分,过滤掉空行和首尾多余空格
  • 从第一行(表头行)里用正则抓四位数字,就是对应年份
  • 跳过表头行,遍历剩下的10条排名数据:
    每一行按逗号拆分后,去掉每段内容首尾的空白,取索引为1的片段就是歌曲标题
  • 把同一年的10个标题存为列表,和年份键值配对塞进最终字典即可

可直接复用的代码示例

import re

def parse_single_year(raw_text: str) -> tuple[str, list[str]]:
    # 拆分文本为非空行,统一去除首尾空白
    lines = [line.strip() for line in raw_text.splitlines() if line.strip()]
    # 提取四位年份
    year = re.search(r"\d{4}", lines[0]).group()
    songs = []
    # 跳过表头,逐行提取歌曲名
    for rank_line in lines[1:]:
        segments = [seg.strip() for seg in rank_line.split(",")]
        # 避免格式异常的行导致报错
        if len(segments) >= 2:
            songs.append(segments[1])
    return year, songs

# 生成你需要的最终字典
# 替换all_year_raw_data为你存储所有年份原始文本的列表
final_result = {}
for year_raw in all_year_raw_data:
    cur_year, cur_songs = parse_single_year(year_raw)
    final_result[cur_year] = cur_songs

特殊情况处理

如果碰到歌曲名本身带逗号的极端情况(历史榜单里这类情况占比极低),可以调整分割逻辑:只定位第一个逗号(排名后)和最后一个逗号(歌手名前)的位置,把两个位置中间的所有内容提取后去除首尾空白,就是完整歌曲名,不会被名字里的逗号截断。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 03:09:18