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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 15:06:16