如何从爬取的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
相关产品推荐
相关产品推荐

