如何用BeautifulSoup从IMDb榜单提取单部电影的Gross数据?
IMDb榜单票房数据提取解决方案
问题背景
已成功提取IMDb榜单中的电影标题,但使用span[name='nv']提取票房时,会同时获取到投票数(Votes)和票房(Gross)数据,无法单独精准提取每部电影的票房金额,需要实现标题与票房的对应提取并生成表格。
解决方案
核心思路是按单部电影的信息块遍历,在每个电影的独立容器内定位票房元素,避免全局查找导致的投票/票房混淆。
完整代码实现:
from bs4 import BeautifulSoup import requests import pandas as pd url = "https://www.imdb.com/list/ls024149810/" page = requests.get(url) soup = BeautifulSoup(page.content, "html.parser") # 存储电影数据的列表 movies = [] # 获取每部电影的信息容器 lister_items = soup.find_all('div', class_='lister-item-content') for item in lister_items: # 提取电影标题 title = item.find('h3', class_='lister-item-header').find('a').text # 提取票房数据:先定位包含"Gross:"的标签,再获取对应的金额 gross_label = item.find('span', string='Gross:') if gross_label: # 票房金额在Gross:标签的下一个span元素中 gross = gross_label.find_next_sibling('span')['data-value'] else: # 部分电影可能无票房数据,标记为缺失值 gross = pd.NA movies.append({'电影标题': title, '票房': gross}) # 生成DataFrame表格 df = pd.DataFrame(movies) print(df)
代码说明
- 按电影容器遍历:通过
div.lister-item-content定位每部电影的独立信息块,确保标题和票房属于同一部电影。 - 精准定位票房:利用
span[string='Gross:']找到票房标签的前置文本,再通过find_next_sibling获取对应的金额元素,彻底避免和投票数混淆。 - 异常处理:对无票房数据的电影,用
pd.NA标记,保证表格数据的完整性。
内容的提问来源于stack exchange,提问作者Juan Pablo Dávila Iriarte
相关产品推荐
相关产品推荐

