0

Scrapyを使用して、Web サイトのコンテンツをAPIを複製するItemsに解析しています。dict

import scrapy

class ScheduleItem(scrapy.Item):
    flight = scrapy.Field()

MySQLCursor.execute()上記のアイテムを、 pyformat スタイルの値を使用してコネクタ/Python ステートメントのデータとして直接使用しようとしています。ただし、次のエラーで落ちています。

(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

挿入する値は 1 つだけで、アイテムには値が 1 つだけあり、どちらも同じキーを使用しているため、このエラーには困惑しています。( Source code here、これは実際に TypeError を隠していることを示しています。) 普通の古い dict を使用すると、正常に動作します。

(Pdb) bar = {'flight': 'abc'}
(Pdb) bar.keys()
['flight']
(Pdb) self.cursor.execute(add_schedule_sql(), bar)
(Pdb)

そして、アイテムを辞書にマップすると、呼び出しも正常に機能します。

(Pdb) self.cursor.execute(add_schedule_sql(), dict(item))
(Pdb)

上記は実際に私の問題を適切に解決するほど単純ですが、アイテムを使用するだけで何が問題なのかまだ知りません。Python 2.7.5、Scrapy 0.24 (最新の安定版)。

4

1 に答える 1

1

以下は私にとってはうまくいきます。そのため、実装を確認する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'
于 2014-09-21T13:59:39.263 に答える