网页爬取时如何将数据写入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])
关键修改点说明:
- 配对遍历:用
zip(mainContainer, secondaryContainer)把两个容器列表一一对应,确保每首歌的主数据和次要数据同时处理。 - 修正class名:原来的
chart-row__main- display多了空格,这会导致BeautifulSoup无法正确匹配元素,我已经修正为chart-row__main-display。 - 使用csv模块:
csv.writer会自动处理内容中的逗号等特殊字符,避免手动拼接字符串导致的列错位问题,同时newline=''和指定encoding='utf-8'能避免换行符和编码问题。 - 统一strip()处理:对所有文本数据做
strip(),去除多余的换行和空格,让CSV更整洁。
这样修改后,你的CSV里每一行都会包含对应歌曲的所有6项数据,完美对应表头的列啦!
内容的提问来源于stack exchange,提问作者Fedolodic
相关产品推荐
相关产品推荐

