在内部调用一个函数' For'循环抛出一个NameError

时间:2015-10-01 08:50:31

标签: python excel python-2.7 selenium-webdriver web-scraping

我试图从FOR循环调用函数但得到错误:

 test()
NameError: name 'test' is not defined

代码如下:

from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.common.keys import Keys
import time
from lxml import html
import requests
import xlwt

browser = webdriver.Firefox() # Get local session of firefox

# 0 wait until the pages are loaded
browser.implicitly_wait(3) # 3 secs should be enough. if not, increase it

browser.get("http://ae.bizdirlib.com/taxonomy/term/1493") # Load page
links = browser.find_elements_by_css_selector("h2 > a")


for link in links:
    link.send_keys(Keys.CONTROL + Keys.RETURN)
    link.send_keys(Keys.CONTROL + Keys.PAGE_UP)
    time.sleep(5)
    test()
    link.send_keys(Keys.CONTROL + 'w')



def test(self):#test function
    elems = browser.find_elements_by_css_selector("div.content.clearfix > div > fieldset> div > ul > li > span")

    for elem in elems:
        print elem.text
    elem1 = browser.find_elements_by_css_selector("div.content.clearfix>div>fieldset>div>ul>li>a")

    for elems21 in elem1:
        print elems21.text 
    return 0

所以我想调用函数,当调用函数时,我希望将数据复制/粘贴到Excel中。

有人可以帮助我增强代码吗?

1 个答案:

答案 0 :(得分:1)

您必须先创建function object才能使用它。在你的情况下,你调用一个函数,但它尚未存在,因此没有定义。正如凯文所说,定义函数然后尝试调用它。

UPD:我无法添加评论,所以我在这里更新。 Mark Lutz在他的“学习Python”一书中详细描述了它,函数如何工作,def做什么以及调用函数时会发生什么。但我认为任何其他Python书都会这样做。

UPD:写评论并不容易,所以我更新答案。

如上所述问题是您在调用函数后定义函数。例如,让我们假设我想编写一个写“玩得开心”+任何名字的程序。为简单起见,程序中给出了名称。 选项1:如果我按照你的意思编写程序1)调用函数2)定义一个函数我会得到一个完全像你得到的NameError。

程序:

greet = 'Have fun, '

print(greet + name('John')) # I call a function 'name'

def name(x):                # I define a function
    return str(x)

输出将是:

Traceback (most recent call last):
  File "C:/Users/nikolay.dudaev/Documents/Private/deffun2.py", line 3, in <module>
    print(greet + name('John'))
NameError: name 'name' is not defined

我需要做的就是更改函数定义的位置并调用函数:

greet = 'Have fun, '

def name(x):                # I define a function
    return str(x)

print(greet + name('John')) # I call a function 'name'

现在的输出是:

======= RESTART: C:/Users/nikolay.dudaev/Documents/Private/deffun2.py =======
Have fun, John
>>> 

你走了!

复制def之后的内容并将其粘贴到for循环之前,它应该可以正常工作(虽然我没有尝试您的代码)。