使用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}")
给新手的小提示
- 可以用
print(first_movie.prettify())把当前电影的HTML结构打印出来,仔细对比投票数和票房的上下文差异,这样能更精准地写定位规则~ - 有些电影可能没有公开票房数据,一定要加
if判断避免代码报错哦!
内容的提问来源于stack exchange,提问作者rjkvc
相关产品推荐
相关产品推荐

