2x嵌套功能中的访问列表

时间:2019-04-15 07:35:02

标签: python python-3.x

def get_html(url):
    response = urllib.request.urlopen(url)
    return response.read()


def parse_main(html):
    webpage = BeautifulSoup(html, features="html.parser")
    table = webpage.find('table', id='itemList')

    for a_tag in table.find_all('a', class_='all'):
        parse_movie(get_html('https://www.somerandommovieswebsite.com' + a_tag['href']))


def parse_movie(html):
    web_page = BeautifulSoup(html, features="html.parser")
    info = web_page.find('h1', class_="moviename")
    movies.append(info.text)


def main():
    movies = []
    parse_main(get_html('https://www.somerandommovieswebsite.com'))
    print(movies)


if __name__ == '__main__':
    main()

如何访问嵌套在 parse_main 中的 parse_movie 中的电影列表(在main()函数中定义)。由于出现“ 未解决的参照'电影'”错误,因此无法在列表中添加任何内容。使用 nonlocal 没有帮助

5 个答案:

答案 0 :(得分:4)

我认为您都不在此处也不使用全局变量作为参数:

def get_html(url):
    response = urllib.request.urlopen(url)
    return response.read()


def parse_main(html):
    movies = []
    webpage = BeautifulSoup(html, features="html.parser")
    table = webpage.find('table', id='itemList')

    for a_tag in table.find_all('a', class_='all'):
        movies.append(
            parse_movie(get_html('https://www.somerandommovieswebsite.com' + a_tag['href']))
        )
    return movies


def parse_movie(html):
    web_page = BeautifulSoup(html, features="html.parser")
    info = web_page.find('h1', class_="moviename")
    return info.text


def main():
    movies = parse_main(get_html('https://www.somerandommovieswebsite.com'))
    print(movies)


if __name__ == '__main__':
    main()

答案 1 :(得分:4)

有几种方法可以实现。

首先定义全局电影。

第二,您可以像这样传递列表作为参数。

由于列表已通过引用传递,并且我们将附加在主函数中定义的列表,因此无需返回主函数。

    def parse_main(html,movies):
    webpage = BeautifulSoup(html, features="html.parser")
    table = webpage.find('table', id='itemList')

    for a_tag in table.find_all('a', class_='all'):
        parse_movie(get_html('https://www.somerandommovieswebsite.com' + a_tag['href']),movies)


def parse_movie(html,movies):
    web_page = BeautifulSoup(html, features="html.parser")
    info = web_page.find('h1', class_="moviename")
    movies.append(info.text)


def main():
    movies = []
    parse_main(get_html('https://www.somerandommovieswebsite.com'),movies)
    print(movies)

第三种方法是在函数内创建列表并返回

    def parse_main(html):
        webpage = BeautifulSoup(html, features="html.parser")
        table = webpage.find('table', id='itemList')
    movies = []

        for a_tag in table.find_all('a', class_='all'):
            movies.append (parse_movie(get_html('https://www.somerandommovieswebsite.com' + a_tag['href'])))
    return movies

    def parse_movie(html):
        web_page = BeautifulSoup(html, features="html.parser")
        info = web_page.find('h1', class_="moviename")
         return info.text

def main():
    movies = parse_main(get_html('https://www.somerandommovieswebsite.com'))
    print(movies)

答案 2 :(得分:1)

movies列表作为参数传递,并避免使用全局变量,在大多数情况下会更好。

问题在于movies是̀ parse_movie中的局部变量,这意味着它与main中定义的变量不同。

我只是将̀ movies变量从main函数传递到parse_movie一个变量,并添加了return语句。

def get_html(url):
    response = urllib.request.urlopen(url)
    return response.read()


def parse_main(html):
    movies = []
    webpage = BeautifulSoup(html, features="html.parser")
    table = webpage.find('table', id='itemList')

    for a_tag in table.find_all('a', class_='all'):
        movies.append(parse_movie(get_html('https://www.somerandommovieswebsite.com' + a_tag['href'])))
    return movies


def parse_movie(html):
    web_page = BeautifulSoup(html, features="html.parser")
    info = web_page.find('h1', class_="moviename")
    return info.text


def main():
    movies = parse_main(get_html('https://www.somerandommovieswebsite.com'))
    print(movies)


if __name__ == '__main__':
    main()

答案 3 :(得分:1)

最简单的方法是使用全局变量。但是您应该尽可能避免使用全局变量。您可以像这样更改代码,避免使用全局变量并将变量作为参数传递。

def get_html(url):
    response = urllib.request.urlopen(url)
    return response.read()


def parse_main(html):
    parse_movies = []
    webpage = BeautifulSoup(html, features="html.parser")
    table = webpage.find('table', id='itemList')

    for a_tag in table.find_all('a', class_='all'):
        parse_movies.append(parse_movie(get_html('https://www.somerandommovieswebsite.com' + a_tag['href'])))
    return movies


def parse_movie(html):
    web_page = BeautifulSoup(html, features="html.parser")
    info = web_page.find('h1', class_="moviename")
    return info.text


def main():
    movies = parse_main(get_html('https://www.somerandommovieswebsite.com'))
    print(movies)


if __name__ == '__main__':
    main()

答案 4 :(得分:0)

movies是主函数中的局部变量,因此通常您的函数找不到它,要么将其设为全局(并不总是一个好主意),要么将其作为参数传递。