Python爬取IMDB电影名返回空列表的元素路径定位问题求解
问题根因
代码返回空列表是两个低级错误导致的:
- 爬取地址错误:当前代码填入的是IMDB搜索结果页URL,不是目标Top250榜单页地址
- 元素选择器完全不匹配页面结构:你查找的
<div class="lister-list">在目标页面不存在,Top250的榜单容器是<tbody class="lister-list">,这行代码返回空结果集,后续for循环根本没有执行,自然拿不到任何数据。
修正后的实现逻辑
- 替换URL为Top250榜单实际地址
- 修正容器定位,匹配页面实际的tbody标签
- 遍历容器下所有tr标签(每个tr对应一部电影条目)
- 在每个条目内定位标题列,提取a标签内的电影名称文本
可直接运行的代码片段:
import requests from bs4 import BeautifulSoup import pandas as pd headers = {"Accept-Language": "en-US, en;q=0.5"} # 替换为Top250榜单地址 url = "https://www.imdb.com/chart/top/?ref_=nv_mv_250" results = requests.get(url, headers=headers) soup = BeautifulSoup(results.text, "html.parser") titles = [] years = [] imdb_rating = [] metascores = [] votes = [] us_gross = [] # 正确定位榜单容器 movie_container = soup.find('tbody', class_='lister-list') # 遍历所有电影条目 for movie in movie_container.find_all('tr'): # 提取电影名称 title_column = movie.find('td', class_='titleColumn') movie_name = title_column.a.text.strip() titles.append(movie_name) # 其余字段可按相同逻辑补充,参考示例: # 上映年份 # movie_year = title_column.span.text.strip('()') # years.append(movie_year) # 评分 # rating_column = movie.find('td', class_='ratingColumn imdbRating') # rating = rating_column.strong.text.strip() # imdb_rating.append(rating) print(titles) # 后续pandas转结构化数据、导出CSV的逻辑可直接复用原有代码
调试建议
- 调试阶段保留
soup.prettify()的打印逻辑,对照实际返回的HTML结构写选择器,不要凭经验猜测标签和类名 - 元素定位优先找带唯一类名、id的上层容器,再逐层向下查找子元素,不要直接写跨层级的链式属性调用(比如原有代码的
container.tr.td.a),很容易因为层级不匹配返回空值或者报错 - 提取文本后统一加
strip()方法,清除多余的换行、空格字符
内容的提问来源于stack exchange,提问作者CodeLearner
相关产品推荐
相关产品推荐

