【问题标题】:NameError: name 'var1' is not defined pythonNameError:名称'var1'未定义python
【发布时间】:2021-10-18 23:44:26
【问题描述】:

我在 python 脚本中随机收到错误“NameError: name 'var1' is not defined”。这只是偶尔发生,但这是问题所在。我该如何解决这个问题?

for i in range(len(list)):
    try:
        driver.get(url)

        innerHTML = driver.page_source
        soup = BeautifulSoup(innerHTML, "html.parser")
        
        for i in soup.select("#SOMETHING"):
            global var1
            var1= i.text
            print(var1)

        global URL
        URL = driver.current_url
        print(URL)

        database.execute("INSERT INTO Database VALUES (?,?,?,?,?,?,?)", (str(var1), str(var2), str(var3), str(var4), str(var5), str(var6), str(var7)))
        database.commit()
   except:
      pass

        driver.close()
        driver.quit()

【问题讨论】:

  • 你能通过代码找出一条路径,var1 不会被赋值吗?我可以。
  • 也许没有进入你声明变量的地方。 for i in soup.select("#SOMETHING"): 所以当你调用 database.execute("INSERT INTO Database VALUES (?,?,?,?,?,?,?)", (str(var1), str(var2), str(var3), str(var4), str(var5), str(var6), str(var7))) 行中的变量时 var1 is not defined
  • global 在模块范围内不做任何事情。它用于在函数、方法等的全局范围内分配变量……全局变量仅在第一次分配时才存在。如果var1 未定义,则意味着分配没有发生 - for 循环没有任何要处理的内容。
  • soup.select("#SOMETHING") 中没有选择任何内容时,您希望发生什么?
  • var2 等也没有定义。他们将是你的下一个错误。您似乎期望从选择中获得 7 个值,而这些值是您插入的?您可以将它们放在一个列表中,如果该列表不是 len 7,则引发错误。

标签: python string variables var nameerror


【解决方案1】:

变量仅在第一次赋值时出现。如果变量不存在,则意味着分配它的代码没有运行(或del 删除它)。 global 不会改变这一点。 global 告诉不在全局范围内的代码(如函数)应该分配给全局命名空间,而不是本地。它实际上并没有创建变量(参见上面的规则)。这段代码没有任何意义,应该删除。

var1for 循环中分配,但前提是for 实际上有数据要处理。如果soup.select("#SOMETHING") 没有找到任何东西,则for 退出并且var1 未被分配。

但这只是您问题的一部分。如果 select 确实找到了某些东西,您将继续覆盖 var1 但不分配给 var2 等...稍后使用的变量。看起来 var 列表更符合您的要求。

for i in range(len(list)): # <-- this is an error too. Don't know what to replaceit with
    try:
        driver.get(url)

        innerHTML = driver.page_source
        soup = BeautifulSoup(innerHTML, "html.parser")
        values = [i.text for i in soup.select("#SOMETHING")]
        if len(values) != 7:
            print("ERROR: All Bad")
            exit(2)

        URL = driver.current_url
        print(URL)

        database.execute("INSERT INTO Database VALUES (?,?,?,?,?,?,?)", values)
        database.commit()
    except:
        print("Um, super bad")
        pass

    driver.close()
    driver.quit()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-26
    • 1970-01-01
    • 2020-09-04
    • 2016-08-09
    • 2016-01-08
    • 2021-07-22
    • 1970-01-01
    相关资源
    最近更新 更多