NameError: глобальное имя «ИМЯ» не определено

У меня было интересное время, когда я создавал небольшой веб-скребок, и я думаю, что делаю что-то не так с моей переменной или областью действия. Всякий раз, когда я пытаюсь выделить некоторые функции в отдельные функции, я получаю ошибку NameError: глобальное имя «ИМЯ» не определено. Я вижу, что у многих людей есть похожая проблема, но, кажется, есть много вариаций с одной и той же ошибкой, и я не могу понять это.

import urllib2, sys, urlparse, httplib, imageInfo
from BeautifulSoup import BeautifulSoup
from collections import deque

global visited_pages
visited_pages = []
global visit_queue
visit_queue = deque([])
global motorcycle_pages
motorcycle_pages = []
global motorcycle_pics
motorcycle_pics = []

global count 
count = 0

def scrapePages(url):
    #variables
    max_count = 20
    pic_num = 20

    #decide how long it should go on...
    global count
    if count >= max_count:
        return

    #this is all of the links that have been scraped
    the_links = []

    soup = soupify_url(url)

    #find all the links on the page
    for tag in soup.findAll('a'):
        the_links.append(tag.get('href'))


    visited_pages.append(url)
    count = count + 1
    print 'number of pages visited'
    print count

    links_to_visit = the_links
#    print 'links to visit'
#    print links_to_visit

    for link in links_to_visit:
        if link not in visited_pages:
            visit_queue.append(link)
    print 'visit queue'
    print visit_queue

    while visit_queue:
        link = visit_queue.pop()
        print link
        scrapePages(link)

    print '***done***'


the_url = 'http://www.reddit.com/r/motorcycles'
#call the function
scrapePages(the_url)


def soupify_url(url):
    try:
        html = urllib2.urlopen(url).read()
    except urllib2.URLError:
        return 
    except ValueError:
        return
    except httplib.InvalidURL:
        return
    except httplib.BadStatusLine:
        return

    return BeautifulSoup.BeautifulSoup(html) 

Вот мой трекбэк:

Traceback (most recent call last):
  File "C:\Users\clifgray\Desktop\Mis Cosas\Programming\appengine\web_scraping\src\test.py", line 68, in <module>
    scrapePages(the_url)
  File "C:\Users\clifgray\Desktop\Mis Cosas\Programming\appengine\web_scraping\src\test.py", line 36, in scrapePages
    soup = soupify_url(url)
NameError: global name 'soupify_url' is not defined

person clifgray    schedule 07.02.2013    source источник
comment
Где появляется ошибка? На какой строке?   -  person Some programmer dude    schedule 07.02.2013
comment
только что добавил трекбэк. это правильно, когда я пытаюсь вызвать функцию soapify_url в функциях scrapePages   -  person clifgray    schedule 07.02.2013
comment
Кстати, использование ключевого слова global в самой верхней области модуля вообще ничего не делает.   -  person Wooble    schedule 07.02.2013


Ответы (1)


Переместите основной код:

the_url = 'http://www.reddit.com/r/motorcycles'
#call the function
scrapePages(the_url)

После точки, где вы определяете soupify_url, т.е. внизу вашего файла.

Python считывает, что определение def scrapePages() определено, затем пытается его вызвать; scrapePages() хочет вызвать функцию с именем soupify_url(), которая еще не определена, поэтому вы получаете:

NameError: global name 'soupify_url' is not defined

Помните о правиле: Все функции должны быть определены до того, как будет выполняться какой-либо код, который действительно работает.

Если вы переместите свой основной код, вызывающий scrapePages(), после определения soupify_url(), все будет определено и в пределах, должно устранить вашу ошибку.

person Mike    schedule 07.02.2013
comment
ах, по какой-то причине я думал, что интерпретатор Python заранее просмотрел код и уловил это. спасибо за исправление моего плохого предположения. - person clifgray; 07.02.2013
comment
@clifgray - Рад помочь, да, я тоже так думал, когда начинал работать с Python, ошибка казалась мне очень знакомой. :) - person Mike; 07.02.2013