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

使用BeautifulSoup爬取IMDb电影票房数据的技术求助

解决IMDb爬虫中投票数与票房数据的定位问题

嘿,刚学Python爬虫碰到这种结构相似的元素混淆问题太正常啦!别着急,咱们一步步来搞定它~

首先得搞清楚:虽然投票数和票房的<span>标签都带name='nv'属性,但它们在页面里的上下文结构肯定不一样——要么是父元素的class不同,要么是旁边的文本提示不同(比如票房旁边会有"Gross"字样,投票数旁边是评分或者"votes"文本)。

给你两个实用的解决方案,都是针对IMDb搜索结果页面的结构设计的:

方案一:通过"Gross"文本定位票房容器

票房数据通常会跟在写着"Gross:"的文本后面,我们可以先找到这个文本所在的元素,再获取它后面的目标span:

# 查找包含"Gross"字样的span元素(处理可能的空格/大小写问题)
gross_label = first_movie.find('span', string=lambda t: 'gross' in t.strip().lower() if t else False)
if gross_label:
    # 获取它的下一个兄弟span,就是存票房数据的那个元素
    box_office_span = gross_label.find_next_sibling('span', attrs={'name': 'nv'})
    if box_office_span:
        # 提取data-value里的数字
        box_office_value = box_office_span['data-value']
        print(f"票房数据:{box_office_value}")

方案二:遍历所有目标span,通过文本内容区分

投票数的span文本里一般会包含"votes",票房的span会有美元符号$,我们可以遍历所有带name='nv'的span,通过文本特征区分:

# 获取当前电影所有带name='nv'的span
all_nv_spans = first_movie.find_all('span', attrs={'name': 'nv'})
for span in all_nv_spans:
    span_text = span.text.lower()
    if 'votes' in span_text:
        # 这是投票数,你已经会提取啦
        votes = span['data-value']
        print(f"投票数:{votes}")
    elif '$' in span_text:
        # 这是票房数据
        box_office_value = span['data-value']
        print(f"票房数据:{box_office_value}")

给新手的小提示

  1. 可以用print(first_movie.prettify())把当前电影的HTML结构打印出来,仔细对比投票数和票房的上下文差异,这样能更精准地写定位规则~
  2. 有些电影可能没有公开票房数据,一定要加if判断避免代码报错哦!

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

相关产品推荐
方舟 Agent Plan

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

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