cmd日志显示问题。 但我尝试的每个解决方案都失败了,每个数据似乎都能正常工作
Traceback (most recent call last):
File "C:\Users\meow\Anaconda3\lib\site-packages\twisted\internet\defer.py", line 653, in _runCallbacks
current.result = callback(current.result, *args, **kw)
File "C:\Users\meow\Desktop\hello\hello\pipelines.py", line 27, in process_item
self.cur.execute(sql.format(col, placeholders), item.values())
ValueError: parameters are of unsupported type
节目详情:
创建表时它工作正常,但根本不插入任何数据。
这是我的管道
import sqlite3
class HelloPipeline(object):
def open_spider(self, spider):#
self.conn = sqlite3.connect("test.sqlite")
self.cur = self.conn.cursor()
self.cur.execute("create table if not exists test(test1 text, test2 text, test3 text,test4 text, test5 text, test6 text, test7 text);")
#pass
def close_spider(self, spider):#
self.conn.commit()
self.conn.close()
#pass
def process_item(self, item, spider):#
col = ",".join(item.keys())
placeholders = ",".join(len(item) * "?")
sql = "insert into test({}) values({})"#
self.cur.execute(sql.format(col, placeholders), item.values())
return item
这是项目
import scrapy
class HelloItem(scrapy.Item):
# define the fields for your item here like:
test1 = scrapy.Field()
...
test7 = scrapy.Field()
这是主程序
class crawler(scrapy.Spider):
...
def parse (self, response):
for data_house in jsondata["data"]["data"]:
yield scrapy.Request(house_detail_domain.format(data_house["post_id"]), self.parse_house_detail)
def parse_house_detail (self, response):
...
testitem = HelloItem()
testitem["test1"] = house_detail.select(".houseInfoTitle")[0].text
...
testitem["test7"] = house_detail.select(".facility")[0].text
return testitem
BTW我也试过像
这样的东西self.cur.execute(sql.format(col, placeholders), (item.values()))
#
self.cur.execute(sql.format(col, placeholders), (item.values(),))
#
val = ",".join(item.values())
self.cur.execute(sql.format(col, placeholders), (val))
etc..
请告诉我是否缺少任何信息
答案 0 :(得分:1)
问题是execute
的第二个参数需要一个元组。你有一个数组,基本上来自item.values()
。要转换为元组,请使用:
self.cur.execute(sql.format(col, placeholders), tuple(item.values()))
您正在考虑正确的行,但是,例如,您的尝试(item.values(),)
会生成一个包含单个值的元组,这是您从values()
返回的整个数组。 tuple(item.values())
将值数组转换为包含每个值作为单个元素的元组。
说你的物品是{ 'name1': 'value1', 'name2': 'value2'}
。然后(item.values(),)
是元组(['value1', 'value2'])
,即具有一个包含数组的值的元组。但是tuple(item.values())
是('value1', 'value2')
,即包含数组中每个项目的值的元组,这就是所需要的。