Python项目报错:horror()函数未定义,求解决方法
解决IMDb电影选择器horror()函数未定义错误
问题场景
我是Python新手,开发了一个基于IMDb网页爬取的按类型筛选的电影选择器,comedy()功能正常运行,但选择恐怖类型时,触发horror()函数未定义的错误,原代码如下:
import random import secrets import requests from bs4 import BeautifulSoup import numpy as np def main(): print("1 Horror.") print('2 Romance.') print("3 Sci-Fi.") print("4 Comedy.") print("0 Exit.") menu() def menu(): while True: choice = int(input("Enter your choice; ")) if choice == 1: print("Horror?") horror() elif choice == 2: print("Romance?") elif choice == 3: print("Comedy?") comedy() elif choice == 4: print("Sci-Fi?") elif choice == 0: print("Goodbye!") break else: print("Invalid choice.") def comedy(): titles = [] pages = np.arange(1, 1001, 50) pages for page in pages: page = requests.get( 'https://www.imdb.com/search/title/?genres=comedy&explore=title_type,genres&pf_rd_m=A2FGELUUNOQJNL&pf_rd_p=3396781f-d87f-4fac-8694-c56ce6f490fe&pf_rd_r=WWP23JMS19Y0FJQ181DT&pf_rd_s=center-1&pf_rd_t=15051&pf_rd_i=genre&ref_=ft_gnr_pr1_i_1') soup = BeautifulSoup(page.text, 'html.parser') movie_div = soup.find_all('div', {'class': 'lister-item mode-advanced'}) for container in movie_div: name = container.h3.a.text titles.append(name) ComedyMovie = (secrets.choice(titles)) print("") print(ComedyMovie) print("") np.delete break main() def horror(): titles = [] pages = np.arange(1, 1001, 50) pages for page in pages: page = requests.get( 'https://www.imdb.com/search/title?genres=horror&explore=title_type,genres&pf_rd_m=A2FGELUUNOQJNL&pf_rd_p=3396781f-d87f-4fac-8694-c56ce6f490fe&pf_rd_r=WWP23JMS19Y0FJQ181DT&pf_rd_s=center-1&pf_rd_t=15051&pf_rd_i=genre&ref_=ft_gnr_pr1_i_3') soup = BeautifulSoup(page.text, 'html.parser') movie_div = soup.find_all('div', {'class': 'lister-item mode-advanced'}) for container in movie_div: # Scraping the movie's name name = container.h3.a.text titles.append(name) HorrorMovie = (secrets.choice(titles)) print("") print(HorrorMovie) print("") np.delete break main()
错误原因
- Python是解释型语言,代码从上到下逐行执行:你在
horror()函数定义之前就调用了main(),此时解释器还未加载horror()的定义,所以触发未定义错误。 - 代码中重复调用了两次
main(),会导致程序启动时重复执行菜单逻辑,属于冗余操作。
修正方案
- 将所有函数定义放在
main()调用之前,确保解释器先加载所有函数 - 仅保留一次
main()调用,放在代码的最后位置
修正后的完整代码
import random import secrets import requests from bs4 import BeautifulSoup import numpy as np def main(): print("1 Horror.") print('2 Romance.') print("3 Sci-Fi.") print("4 Comedy.") print("0 Exit.") menu() def menu(): while True: choice = int(input("Enter your choice; ")) if choice == 1: print("Horror?") horror() elif choice == 2: print("Romance?") elif choice == 3: print("Sci-Fi?") elif choice == 4: print("Comedy?") comedy() elif choice == 0: print("Goodbye!") break else: print("Invalid choice.") def comedy(): titles = [] pages = np.arange(1, 1001, 50) for page in pages: page = requests.get( 'https://www.imdb.com/search/title/?genres=comedy&explore=title_type,genres&pf_rd_m=A2FGELUUNOQJNL&pf_rd_p=3396781f-d87f-4fac-8694-c56ce6f490fe&pf_rd_r=WWP23JMS19Y0FJQ181DT&pf_rd_s=center-1&pf_rd_t=15051&pf_rd_i=genre&ref_=ft_gnr_pr1_i_1') soup = BeautifulSoup(page.text, 'html.parser') movie_div = soup.find_all('div', {'class': 'lister-item mode-advanced'}) for container in movie_div: name = container.h3.a.text titles.append(name) # 收集完所有标题后再随机选择,避免重复选同一个 ComedyMovie = secrets.choice(titles) print("") print(ComedyMovie) print("") break def horror(): titles = [] pages = np.arange(1, 1001, 50) for page in pages: page = requests.get( 'https://www.imdb.com/search/title?genres=horror&explore=title_type,genres&pf_rd_m=A2FGELUUNOQJNL&pf_rd_p=3396781f-d87f-4fac-8694-c56ce6f490fe&pf_rd_r=WWP23JMS19Y0FJQ181DT&pf_rd_s=center-1&pf_rd_t=15051&pf_rd_i=genre&ref_=ft_gnr_pr1_i_3') soup = BeautifulSoup(page.text, 'html.parser') movie_div = soup.find_all('div', {'class': 'lister-item mode-advanced'}) for container in movie_div: name = container.h3.a.text titles.append(name) # 收集完所有标题后再随机选择 HorrorMovie = secrets.choice(titles) print("") print(HorrorMovie) print("") break # 仅调用一次main(),放在所有函数定义之后 main()
另外还优化了一个小问题:原代码中每次循环容器都重新随机选择一次标题,修正后改为收集完所有标题再随机选择,逻辑更合理。
内容的提问来源于stack exchange,提问作者newtopython
相关产品推荐
相关产品推荐

