NameError: 全局名称'NAME'未定义
我最近在做一个小的网页抓取工具,感觉自己在变量或函数的作用域上可能搞错了。每当我试着把一些功能拆分成单独的函数时,就会出现NameError: global name 'NAME' is not defined的错误。我发现很多人也遇到类似的问题,但大家的情况各不相同,我就是搞不明白到底是怎么回事。
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
1 个回答
5
把你的主要代码移动一下:
the_url = 'http://www.reddit.com/r/motorcycles'
#call the function
scrapePages(the_url)
也就是把它放到你定义了 soupify_url
之后,也就是文件的底部。
Python 在读取的时候,发现 scrapePages()
这个函数已经定义了,然后它尝试去调用它;但是 scrapePages()
里面又想调用一个叫 soupify_url()
的函数,而这个函数还没有定义,所以你就会看到一个错误:
NameError: global name 'soupify_url' is not defined
记住这个规则:所有的函数必须在任何实际执行的代码之前定义
如果你把调用 scrapePages()
的主要代码移动到 soupify_url()
定义之后,所有的东西都会被定义好,这样就能解决你的错误了。