簡體   English   中英

ValueError:mysql scrapy pipline中不支持的格式字符

[英]ValueError: unsupported format character in mysql scrapy pipline

我正在研究一個抓癢的履帶,這個問題真的使我感到困擾,因為我已經被這個問題困擾了好幾天了。

當我使用“?”時,此占位符功能可以正常工作 而不是“%s”用於SQLite數據庫。 但是在使用“?”時 當數據庫切換到MySQL時,它顯示:

“ TypeError:在字符串格式化期間並非所有參數都已轉換”

即使我花了很多心血修改代碼並更改占位符(據說?),它仍然顯示:

“查詢=查詢%self._escape_args(args,conn)ValueError:不支持的格式字符','”

進一步來說 :

Traceback (most recent call last):

  File "/usr/lib64/python3.4/dist-packages/twisted/internet/defer.py", line 653, in _runCallbacks
    current.result = callback(current.result, *args, **kw)

File "/home/ec2-user/lulu_testing/get_download_file/hello_scrapy/hello/hello/pipelines.py", line 42, in process_item
    self.cur.execute(insert_query, insert_values)

File "/usr/lib/python3.4/dist-packages/pymysql/cursors.py", line 163, in execute
    query = self.mogrify(query, args)

File "/usr/lib/python3.4/dist-packages/pymysql/cursors.py", line 142, in mogrify
    query = query % self._escape_args(args, conn)

ValueError: unsupported format character ',' (0x2c) at index 94

mysql版本的pipline

import pymysql
import scrapy
from hello.items import HelloItem

class HelloPipeline(object):

def __init__(self):#

    self.conn = pymysql.connect(host="localhost", port=3306, user="root", passwd="lulu", db="test", charset="utf8", use_unicode=True)
    self.cur = self.conn.cursor()


    self.cur.execute("drop table IF EXISTS test;")
    self.conn.commit()

    self.cur.execute("create table if not EXISTS table_test_4(test0 text, test1 text, test2 text, test3 text,test4 text, test5 text, test6 text, test7 text, test8 text, test9 text);")
    self.conn.commit()

    #pass


def process_item(self, item, spider):#

    col = ",".join(item.keys())
    placeholders = ",".join(len(item) * "%s")

    insert_query = "INSERT INTO test_table_4({0}) VALUES({1});".format(col,placeholders)

    insert_values = tuple(item.values())


    self.cur.execute(insert_query, insert_values)

    return item

def close_spider(self, spider):#
    self.cur.close()
    self.conn.close()
    #pass

SQLite版本(我使用的是b4)

import sqlite3
import scrapy
from hello.items import HelloItem

class HelloPipeline(object):

def open_spider(self, spider):#
    self.conn = sqlite3.connect("test_database_ver_2018_03_31.sqlite")
    self.cur = self.conn.cursor()
    self.cur.execute("create table if not exists test_table(test0 text, test1 text, test2 text, test3 text,test4 text, test5 text, test6 text, test7 text, test8 text, test9 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_table({}) values({})"


    self.cur.execute(sql.format(col, placeholders), tuple(item.values()))


    return item

主scrapy爬蟲程序的數據設置

    testitem = HelloItem()

    testitem["test0"] = house_detail.select(".houseInfoTitle")[0].text        
    testitem["test1"] = house_detail.select(".pageView")[0].text 
    testitem["test2"] = house_detail.select(".detailInfo")[0].text
    testitem["test3"] = house_detail.select(".houseIntro")[0].text
    testitem["test4"] = house_detail.select(".lifeBox")[0].text
    testitem["test5"] = house_detail.select(".labelList")[0].text
    testitem["test6"] = house_detail.select(".facility")[0].text
    testitem["test7"] = str(house_detail.select(".userInfo"))
    testitem["test8"] = str(house_detail.select(".banner"))
    testitem["test9"] = str(house_detail.select("#show"))

    return testitem

項目設置

import scrapy


class HelloItem(scrapy.Item):

test0 = scrapy.Field()
test1 = scrapy.Field()
test2 = scrapy.Field()
test3 = scrapy.Field()
test4 = scrapy.Field()
test5 = scrapy.Field()
test6 = scrapy.Field()
test7 = scrapy.Field()
test8 = scrapy.Field()
test9 = scrapy.Field()

問題是這一行:

placeholders = ",".join(len(item) * "%s")

沒有按照您的期望做。

>>> item = {'a': 1, 'b': 2, 'c': 3}
>>> placeholders = ",".join(len(item) * "%s")
>>> print(placeholders)
%,s,%,s,%,s     

",".join(len(item) * "%s")做兩件事-計算len(item) * "%s" ,然后將結果與','聯接。

len(item) * '%s'是字符串(或可迭代的'%s%s%s' str.join(iterable)返回一個字符串,該字符串由提供方法的字符串分隔的所有iterable元素組成。 所以打電話的結果

','.join('%s%s%s')

'%,s,%,s,%,s' ,而不是'%s,%s,%s'

你想做

>>> ",".join(len(item) * ["%s"])
'%s,%s,%s'

要么

>>> ",".join('%s' for _ in item)
'%s,%s,%s'

因此, str.join在可迭代的'%s'字符串上進行操作,而不是對'%s%s%s'這樣的單個字符串進行操作。 `

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM