Python技术问询:爬虫数据存入空字典仅保留最后一条
问题解决:保存所有爬取的IMDB电影数据
你的代码存在两个核心问题:
- 缩进错误:
data = {}的位置不在try代码块内,且位置错误,导致无法正确访问movies变量 - 循环中没有将每部电影的数据添加到
data字典中,最终输出的是空字典
修正后的代码
from bs4 import BeautifulSoup import requests import pandas as pd import numpy try: source = requests.get('https://www.imdb.com/chart/top/') source.raise_for_status() soup = BeautifulSoup(source.text,'html.parser') movies = soup.find('tbody', class_="lister-list").find_all('tr') data = {} # 移至try块内、movies变量定义之后 for movie in movies: name = movie.find('td', class_='titleColumn').a.text rank = movie.find('td', class_="titleColumn").get_text(strip=True).split('.')[0] year = movie.find('td', class_="titleColumn").span.text.strip('()') rating = movie.find('td', class_="ratingColumn imdbRating").strong.text # 向字典添加元素:用电影排名作为键,对应值为存储详细信息的子字典 data[rank] = { 'name': name, 'year': year, 'rating': rating } except Exception as e: print(e) print(data)
更适合后续处理的优化方案(列表存储字典)
如果之后需要将数据转为DataFrame进行分析,用列表存储每个电影的字典会更便捷:
# 在try块内替换data的初始化和循环逻辑 data = [] for movie in movies: # 前面的变量获取代码不变 data.append({ 'rank': rank, 'name': name, 'year': year, 'rating': rating }) # 转换为DataFrame df = pd.DataFrame(data) print(df)
关键说明
- 字典添加元素的基础语法:
字典名[键] = 值,这里用唯一的电影排名作为键,确保每条数据不会被覆盖 - 必须保证变量在正确的缩进块内,避免因作用域问题导致的访问错误
内容的提问来源于stack exchange,提问作者peter kim
相关产品推荐
相关产品推荐

