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

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(),会导致程序启动时重复执行菜单逻辑,属于冗余操作。

修正方案

  1. 将所有函数定义放在main()调用之前,确保解释器先加载所有函数
  2. 仅保留一次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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 05:35:18