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

网页爬取时如何将数据写入CSV指定列?Billboard爬取格式异常求助

解决Billboard R&B/Hip-Hop榜单CSV写入格式错位问题

嘿,我一眼就看出问题出在哪了!你现在的代码是先把所有歌曲的排名、歌手、歌名写完50行,然后再把上周排名、峰值、在榜周数接着写在后面,这自然会导致数据完全错位,两类数据各占半段CSV。

正确的思路应该是每处理一首歌曲,就把它的所有6项数据一次性写入同一行,因为主容器(mainContainer)和次要容器(secondaryContainer)是一一对应的,每一个主容器对应同一位置的次要容器。

另外,手动拼接CSV字符串很容易因为内容里的逗号(比如歌手名里的分隔符)导致列错位,推荐用Python内置的csv模块来处理,更稳妥。

下面是修正后的完整代码:

from urllib.request import urlopen as uReq
from bs4 import BeautifulSoup as soup
import csv

my_url = 'https://www.billboard.com/charts/r-b-hip-hop-songs'

# 打开网页连接并获取内容
uClient = uReq(my_url)
page_html = uClient.read()
uClient.close()

# HTML解析
page_soup = soup(page_html, "html.parser")

# 注意修正class名的拼写错误:原来的"chart-row__main- display"多了空格
mainContainer = page_soup.findAll("div", {"class":"chart-row__main-display"})
secondaryContainer = page_soup.findAll("div", {"class":"chart-row__secondary"})

# 使用csv模块写入文件,避免手动拼接的问题
filename = "Billboard_Hip_Hop_Charts.csv"
with open(filename, "w", newline='', encoding='utf-8') as f:
    writer = csv.writer(f)
    # 写入表头
    headers = ["Billboard Number", "Artist Name", "Song Title", "Last Week Number", "Peak Position", "Weeks On Chart"]
    writer.writerow(headers)
    
    # 同时遍历主容器和次要容器,一一配对处理每一行数据
    for main, secondary in zip(mainContainer, secondaryContainer):
        # 获取排名
        billboard_number = main.div.span.text.strip()
        # 获取歌手名
        artist_name = main.find("span", {"class":"chart-row__artist"}).text.strip()
        # 获取歌名
        song_title = main.h2.text.strip()
        
        # 获取次要容器的三个数据
        secondary_values = secondary.findAll("span", {"class":"chart-row__value"})
        last_week_number = secondary_values[0].text.strip()
        peak_position = secondary_values[1].text.strip()
        weeks_on_chart = secondary_values[2].text.strip()
        
        # 打印验证
        print(f"排名: {billboard_number} | 歌手: {artist_name} | 歌曲: {song_title}")
        print(f"上周排名: {last_week_number} | 峰值: {peak_position} | 在榜周数: {weeks_on_chart}\n")
        
        # 将所有数据写入同一行
        writer.writerow([billboard_number, artist_name, song_title, last_week_number, peak_position, weeks_on_chart])

关键修改点说明:

  1. 配对遍历:用zip(mainContainer, secondaryContainer)把两个容器列表一一对应,确保每首歌的主数据和次要数据同时处理。
  2. 修正class名:原来的chart-row__main- display多了空格,这会导致BeautifulSoup无法正确匹配元素,我已经修正为chart-row__main-display。
  3. 使用csv模块:csv.writer会自动处理内容中的逗号等特殊字符,避免手动拼接字符串导致的列错位问题,同时newline=''和指定encoding='utf-8'能避免换行符和编码问题。
  4. 统一strip()处理:对所有文本数据做strip(),去除多余的换行和空格,让CSV更整洁。

这样修改后,你的CSV里每一行都会包含对应歌曲的所有6项数据,完美对应表头的列啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:07:07