我正在使用Scrapy将网站内容解析为Items,复制dict
API:
import scrapy
class ScheduleItem(scrapy.Item):
flight = scrapy.Field()
我正在尝试使用pyformat-style值直接使用上面的Item作为Connector / Python MySQLCursor.execute()
语句的数据。然而,它正在崩溃,出现以下错误:
(Pdb) add_schedule_sql()
'INSERT INTO schedules (flight) VALUES (%(flight)s)'
(Pdb) foo = items.ScheduleItem();
(Pdb) foo['flight'] = 'abc'
(Pdb) foo.keys()
['flight']
(Pdb) print foo
{'flight': 'abc'}
(Pdb) self.cursor.execute(add_schedule_sql(), foo)
*** ProgrammingError: Wrong number of arguments during string formatting
在Item中只插入一个值和一个值,两个都有相同的键,所以我对此错误感到困惑。 (Source code here,表示它实际上隐藏了一个TypeError。)如果我使用普通的旧dict,它可以正常工作:
(Pdb) bar = {'flight': 'abc'}
(Pdb) bar.keys()
['flight']
(Pdb) self.cursor.execute(add_schedule_sql(), bar)
(Pdb)
如果我将项目映射到dict,那么调用也可以正常工作:
(Pdb) self.cursor.execute(add_schedule_sql(), dict(item))
(Pdb)
以上很简单,它实际上足以解决我的问题,但我仍然对使用Item的错误感到好奇。 Python 2.7.5,Scrapy 0.24(最新稳定版)。
答案 0 :(得分:0)
以下适用于我。因此,我们需要查看ScheduleItem
的实现,并且还需要所涉及的库的版本号。
In [10]: class ScheduleItem(scrapy.Item):
flight = scrapy.Field()
delay = scrapy.Field()
....:
In [11]: foo = ScheduleItem()
In [12]: foo['flight'] = 'abc'
In [13]: foo
Out[13]: {'flight': 'abc'}
In [14]: "test %(flight)s str"%(foo)
Out[14]: 'test abc str'
In [15]: "test (flight) and %(flight)s str"%(foo)
Out[15]: 'test (flight) and abc str'