使用BeautifulSoup爬取IMDB喜剧片数据遇两类问题求解决
IMDB喜剧片数据爬取问题解决方案
问题1:部分影片无runtime字段,调用get_text()报错
当find()方法找不到对应元素时会返回None,直接调用get_text()会触发"不可调用"错误。解决思路是先判断元素是否存在,再提取文本:
- 获取目标元素后,若元素存在则调用
get_text(),否则赋值为预设默认值(比如"无时长数据")
问题2:无法正确获取影片描述
原代码中p.text获取的是第一个<p>标签内容,而IMDB页面里影片描述是第二个带text-muted类的<p>标签,需要指定提取第二个标签的内容。
修改后的完整代码
import requests from bs4 import BeautifulSoup source = requests.get('https://www.imdb.com/search/title/?title_type=feature&genres=comedy&explore=genres') source.raise_for_status() soup = BeautifulSoup(source.text, 'html.parser') comedy_movies = soup.find_all('div', class_ = "lister-item mode-advanced") for movie in comedy_movies: # 电影标题 movie_title = movie.find('div', class_ = 'lister-item-content').a.text # 分级信息 advisory = advisory.get_text(strip=True) if (advisory := movie.find('span', class_ = 'certificate')) else '无分级数据' # 影片时长 runtime = runtime.get_text(strip=True) if (runtime := movie.find('span', class_ = 'runtime')) else '无时长数据' # 影片类型 genre = genre.get_text(strip=True) if (genre := movie.find('span', class_ = 'genre')) else '无类型数据' # IMDB评分 rating = rating.get_text(strip=True) if (rating := movie.find('span', class_ = 'global-sprite rating-star imdb-rating')) else '无评分数据' # 元评分 metascore = metascore.find('span').get_text(strip=True) if (metascore := movie.find('div', class_ = 'inline-block ratings-metascore')) else '无元评分数据' # 影片描述 desc_p_list = movie.find('div', class_ = 'lister-item-content').find_all('p', class_='text-muted') description = desc_p_list[1].get_text(strip=True) if len(desc_p_list) >=2 else '无描述数据' print(f"标题: {movie_title}") print(f"分级: {advisory}") print(f"时长: {runtime}") print(f"类型: {genre}") print(f"IMDB评分: {rating}") print(f"元评分: {metascore}") print(f"描述: {description}\n")
关键修改点说明
- 所有可能为空的字段都添加了存在性判断,避免
None调用方法的报错 - 影片描述通过
find_all('p', class_='text-muted')获取所有目标p标签,取索引1的元素(第二个)拿到正确描述 - 使用
strip=True去除文本中的多余空格和换行符,让输出数据更整洁
内容的提问来源于stack exchange,提问作者kevon cambridge
相关产品推荐
相关产品推荐

