类型错误:不支持解码Unicode

6

我是新手,正在学习Python。尝试将解析器正确地解码到SQLite数据库中,但它就是无法工作 :(

# coding: utf8
from pysqlite2 import dbapi2 as sqlite3
import urllib2
from bs4 import BeautifulSoup
from string import *


conn = sqlite3.connect(':memory:')
cursor = conn.cursor()

# # create a table
def createTable():
    cursor.execute("""CREATE TABLE characters
                      (rank INTEGER PRIMARY KEY, word TEXT, definition TEXT) 
                   """)


def insertChar(rank,word,definition):
    cursor.execute("""INSERT INTO characters (rank,word,definition)
                        VALUES (?,?,?)""",(rank,word,definition))


def main():
    createTable()

    # u = unicode("辣", "utf-8")

    # insertChar(1,u,"123123123")

    soup = BeautifulSoup(urllib2.urlopen('http://www.zein.se/patrick/3000char.html').read())
    # print (html_doc.prettify())   

    tables = soup.blockquote.table

    # print tables

    rows = tables.find_all('tr')
    result=[]
    for tr in rows:
        cols = tr.find_all('td')
        character = []
        x = cols[0].string 
        y = cols[1].string 
        z = cols[2].string 
        xx = unicode(x, "utf-8")
        yy = unicode(y , "utf-8")
        zz = unicode(z , "utf-8")
        insertChar(xx,yy,zz)

    conn.commit() 

main()

我一直遇到以下错误: TypeError: 不支持解码Unicode
WARNING:root:Some characters could not be decoded, and were replaced with REPLACEMENT CHARACTER.
Traceback (most recent call last):
  File "sqlitetestbed.py", line 64, in <module>
    main()
  File "sqlitetestbed.py", line 48, in main
    xx = unicode(x, "utf-8")


Traceback (most recent call last):
File "sqlitetestbed.py", line 52, in <module>
main()
File "sqlitetestbed.py", line 48, in main
insertChar(x,y,z)
File "sqlitetestbed.py", line 20, in insertChar
VALUES (?,?,?)""",(rank,word,definition))
pysqlite2.dbapi2.IntegrityError: datatype mismatch

我可能正在做一些非常愚蠢的事情... :( 请告诉我我做错了什么... 谢谢!

(这段文字与IT技术无关)

1
啊,Unicode。每个Python开发者的噩梦 - 等等,你为什么要使用unicode()?用u"博人"并按照Python的方式来做吧。 - Amelia
@Hiroto,你是在建议用字面量替换代码吗? - wRAR
@wRAR 我的意思是要插入被注释掉的部分。代码本身中的 unicode() 调用是多余的,并且会抛出错误。 - Amelia
@Hiroto 它们已被注释掉,因此与问题无关。 - wRAR
@wRAR它们在代码主体中,因此可以合理地(并且通常是显而易见的)假设OP在其他地方使用了该代码。这就是为什么它是一个注释的原因。 - Amelia
1个回答

6

x已经是unicode,因为cols[0].string字段包含unicode(正如文档所述)。


好的...所以我现在使用了x而不是xx...我得到了一个Traceback (most recent call last): File "sqlitetestbed.py", line 52, in <module> main() File "sqlitetestbed.py", line 48, in main insertChar(x,y,z) File "sqlitetestbed.py", line 20, in insertChar VALUES (?,?,?)""",(rank,word,definition))。为什么会这样? - user805981
抱歉,这里是翻译内容:Traceback (most recent call last): File "sqlitetestbed.py", line 52, in <module> main() File "sqlitetestbed.py", line 48, in main insertChar(x,y,z) File "sqlitetestbed.py", line 20, in insertChar VALUES (?,?,?)""",(rank,word,definition)) pysqlite2.dbapi2.IntegrityError: datatype mismatch - user805981
它应该是一个数字...所以我用 x = cols[0].integer 代替了 x = cols[0].string ...它经过解析器的处理,看起来应该已经插入到了数据库中,但是当我打开数据库文件时,它是空的。 :/ - user805981
@user805981,你从哪里得到了那个.integer字段?我在文档中没有看到它。 - wRAR
1
@user805981 这与这个问题有什么关系? - wRAR
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接