【问题标题】:Calling a function inside 'For' loop throws a NameError在“For”循环中调用函数会引发 NameError
【发布时间】:2015-10-01 08:50:30
【问题描述】:

我试图从 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 中。

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

【问题讨论】:

  • 为什么要在定义函数之前调用它?
  • 我在底部定义....
  • 尝试在顶部定义它。这就是我的意思在定义函数之前调用它
  • Python 是一种解释型语言,所以在使用前先定义函数
  • 对不起各位,请给我一个参考,我可以阅读更多相关信息。

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


【解决方案1】:

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

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

UPD:写cmets不容易,所以我更新一下答案。

如前所述,问题是您在调用函数后定义函数。例如,假设我想编写一个写“玩得开心”+任何名字的程序。为简单起见,程序中给出了名称。 选项 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 循环之前,它应该可以工作(尽管我没有尝试您的代码)。

【讨论】:

  • python 的新手,如果你能告诉我错误的原因。怎么解决??
  • 在引用此Link from stack SO 后,将整个代码添加到一个带有 self 的类中。
  • 正如您在另一个问题中看到的那样,类也是如此:首先定义一个类,然后使用它。
  • 我的函数不接受程序中的任何值。抱歉,但事实证明它非常令人困惑......更清晰的示例将对功能有很大帮助。如果你给我一个例子,那就太好了......
  • def printme( str ): "这会将传递的字符串打印到此函数中" print str return; ` # 现在你可以调用 printme 函数 printme("I'm first call to user defined function!") printme("Again second call to the same function")` 它的格式和我之前做的一样,但现在我把它改成了使用类....
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-11
  • 1970-01-01
  • 1970-01-01
  • 2014-11-26
  • 2021-02-21
相关资源
最近更新 更多