【问题标题】:UnboundLocalError: local variable 'items' referenced before assignment [duplicate]UnboundLocalError:分配之前引用的局部变量“项目”[重复]
【发布时间】:2012-01-31 12:33:37
【问题描述】:

可能重复:
convert list to string to insert into my sql in one row in python scrapy

我正在尝试将从 HTML 页面中提取的数据直接写入 MySQL 数据库。但是过去可以工作的代码不再有效。有人可以帮帮我吗?

def parse(self, response):
    hxs = HtmlXPathSelector(response)
    sites = hxs.select('//ul/li')
    con = MySQLdb.connect(
        host="localhost",
        user="dreamriks",
        passwd="dreamriks",
        db="scraped_data"
    )
    cur = con.cursor()
    for site in sites:
        items = [site.select('//h2').extract()]
        item = [site.select('//h3').extract()]
        meta = [site.select('//meta').extract()]
    for index in range (len( items)):              #<-- exception raises here
        str = items[index]
        cur.execute("""Insert into h2_meta(h2) Values(%s)""",(str))
    con.commit()
    con.close()

上面的代码给出了以下错误:

exceptions.UnboundLocalError: local variable 'items' referenced before assignment

【问题讨论】:

  • 你需要用更合适的标题提出更好的问题。这个问题对其他人几乎没有任何价值,即使有,人们如何搜索它?此外,审查用户名和密码可能是个好主意。

标签: python variable-assignment


【解决方案1】:

你的缩进被破坏了。缩进块

for index in range (len( items)):
    str = items[index]
    cur.execute("""Insert into h2_meta(h2) Values(%s)""",(str))

还有四个空格。

【讨论】:

  • 嗨 Tichodroma,我将所有内容分配给第一个循环中的列表项,然后将列表中的每个项移动到 mysql 数据库中的一行。您建议的方法是否适合这件事?
  • 可能不会。在这种情况下,保持缩进不变,但在for site in sites 循环上方添加items = []。问:itemmeta 有什么用?
  • 蜘蛛正在爬取大约 1000 个 URL,并在第一个循环中从每个 URL 中提取 h2 和元标记,然后将列表项和元的每个元素插入到 mysql 数据库的一行中。所以使用项目和元作为列表
【解决方案2】:

您似乎遇到了缩进问题。 for index in range(len(items))for site in sites 循环的一部分,对吧?

    for site in sites:
        items = [site.select('//h2').extract()]
        item = [site.select('//h3').extract()]
        meta = [site.select('//meta').extract()]
        for index in range (len( items)):             # <-- make sure this has same
             str = items[index]                       # level of indenting as previous lines
             cur.execute("""Insert into h2_meta(h2) Values(%s)""",(str))

【讨论】:

  • 我将所有内容分配给第一个循环中的列表项,然后将列表中的每个项移动到 mysql 数据库中的一行。您建议的方法是否适合这件事?
【解决方案3】:

如果for site in sites: 没有迭代,因为sites 是空的,那么items 永远不会被初始化。

当您在 for index in range (len( items)): 中引用它时,代码假定 items 已被初始化。

【讨论】:

  • 请给我一些解决方案。我无法更正此代码。
猜你喜欢
  • 2013-02-28
  • 2021-12-16
  • 2015-05-31
  • 2021-04-02
  • 2021-08-19
  • 1970-01-01
  • 2012-06-06
相关资源
最近更新 更多