2016-03-12 122 views
1

我有擦傷一個網站,並寫入到MySQL的Python + Scrapy + MySQL的utf8編碼錯誤

一個scrapy代碼
import MySQLdb.cursors 

def __init__(self,stats): 
    self.dbpool = adbapi.ConnectionPool(<dbnam>,host=<host>,user=<user>,port=<port>,passwd=<pwd>, db=<dbname>, cursorclass=MySQLdb.cursors.DictCursor, charset='utf8', use_unicode=True) 

def process_item(self, item, spider): 
    query = self.dbpool.runInteraction(self._conditional_insert, item) 
    query.addErrback(self.handle_error) 

Scrapy腳本數字表列表

item['numbers'] = sites.xpath('//*[@id="numbers-0"]/tbody/tr/td/text()').extract() 

我刮以下內容:10「11」12「等我的代碼返回以下內容:

'numbers': [u'10\u2033', u'11\u2033', u'12\u2033'], 

將此插入到MySQL數據庫拋出一個錯誤消息 - 我猜是由於unicode問題。

tx.execute("""INSERT INTO numbers ('{0}').format(", ".join(item['numbers']))) 

請問您能否幫助插入成功。更好的是,如何從列表中刪除特殊字符'\ u2033'?

在此先感謝!

+0

你使用的是Python 2還是3? –

+0

2.7.11感謝Bernard對此進行研究! – user6055239

+0

不用擔心,你會介意嘗試使用[PyMySQL](https://github.com/PyMySQL/PyMySQL)而不是MySQL連接器嗎? –

回答

1

您可能會得到一個UnicodeEncodeError,因爲您試圖將包含非ASCII字符的Unicode字符串插入到字節字符串中。

爲了解決這個問題,請確保您的查詢字符串有一個u前綴:

tx.execute(u"""INSERT INTO numbers ('{0}')""".format(", ".join(item['numbers']))) 

如果你真的想擺脫那些雙首要人物,我想你可以只是雙替換它們報價:

item['numbers'] = [s.replace(u'\u2033', '"') for s in item['numbers']] 

但我覺得這是更好地確保您的代碼可以處理任何Unicode字符都扔在它 - 這是說,你應該總是程序中使用Unicode字符串。

+0

謝謝@ekhumoro!這工作 – user6055239

+0

我不能upvote你的答案,因爲我是新的stackoverflow。一旦我贏得一些信譽將會回來! :) – user6055239

+0

@ user6055239。謝謝:)注意:你總是可以[接受答案](http://stackoverflow.com/help/accepted-answer),這也會讓你獲得一點回報。 – ekhumoro