尝试将UTF-8数据插入Mysql

时间:2015-09-23 20:58:17

标签: python mysql utf-8 character-encoding rss

我正在尝试为学校项目创建一个新闻应用程序,我可以从我当地报纸的RSS源中获取信息,以便将多份报纸合并为一份。

当我尝试将收集的数据插入我的Mysql数据库时,我遇到了问题。

当我只打印我的日期(例如:print urlnzz.entries [0] .description)时,德国字符没有问题,例如üäöéà。

当我尝试将数据插入到Mysql数据库中时,我得到"UnicodeEncodeError: 'ascii' codec can't encode character.."。奇怪的是,这只发生在.title和.description上,而不是.category(即使那里也有ü等)

我一直在寻找一段时间的答案,我用

更改了变量的编码
t = urlbernerz.entries[i].title


print t.encode('utf-8')
当我连接到数据库时,

将charset更改为utf-8,甚至尝试了python的“try / except”功能,但似乎没有任何工作。

我已经检查了每个条目的类型(u ['entries']。title)并且它们都是unicode,现在我需要对它们进行编码,我可以将它们放入我的mysqldatabase

在rss网站上它声明它已经编码为utf-8,即使我明确告诉python将其编码为utf-8,它仍然给我错误:'ascii'编解码器无法编码字符u'\ xf6'

我已经尝试了很多这个问题的答案,例如使用str()或使用chardet,但似乎没有任何效果。这是我的代码

import MySQLdb
import feedparser
#!/usr/bin/env python
# -*- coding: UTF-8 -*-

db = MySQLdb.connect(host="127.0.0.1", 
                     user="root",
                      passwd="",
                      db="FeedStuff",
                     charset='UTF8')
db.charset="utf8"
cur = db.cursor()




urllistnzz =['international', 'wirtschaft', 'sport']
urllistbernerz =['kultur', 'wissen', 'leben']


for u in range (len(urllistbernerz)):
    urlbernerz = feedparser.parse('http://www.bernerzeitung.ch/'+urllistbernerz[u]+'/rss.html')
    k = len(urlbernerz['entries'])
    for i in range (k):
        cur.execute("INSERT INTO articles (title, description, date, category, link, source) VALUES (' "+ str(urlbernerz.entries[i].title)+"  ', ' " + str(urlbernerz.entries[i].description)+ " ', ' " + urlbernerz.entries[i].published + " ', ' " + urlbernerz.entries[i].category + " ', ' " + urlbernerz.entries[i].link + " ',' Berner Zeitung')")

for a in range (len(urllistnzz)):
    urlnzz = feedparser.parse('http://www.nzz.ch/'+urllistnzz[a]+'.rss')
    k = len(urlnzz['entries'])
    for i in range (k):
        cur.execute("INSERT INTO articles (title, description, date, category, link, source) VALUES (' "+str(urlnzz.entries[i].title)+" ', ' " + str(urlnzz.entries[i].description)+ " ', ' " + urlnzz.entries[i].published + " ', ' " + urlnzz.entries[i].category + " ', ' " + urlnzz.entries[i].link + " ', 'NZZ')")



db.commit()

cur.close()
db.close()

3 个答案:

答案 0 :(得分:0)

假设df_out = pd.DataFrame(np.random.random([5,5]), columns=list('ABCDE')) df_out.iat[1,0] = np.nan df_out.iat[2,1] = np.nan df_out.to_csv('my_file.csv') df = pd.read_csv('my_file.csv', dtype={col: np.float32 for col in list('ABCDE')}) >>> df.info() <class 'pandas.core.frame.DataFrame'> Int64Index: 5 entries, 0 to 4 Data columns (total 6 columns): Unnamed: 0 5 non-null int64 A 4 non-null float32 B 4 non-null float32 C 5 non-null float32 D 5 non-null float32 E 5 non-null float32 dtypes: float32(5), int64(1) memory usage: 180.0 bytes >>> df.dropna(axis=0, how='any') Unnamed: 0 A B C D E 0 0 0.176224 0.943918 0.322430 0.759862 0.028605 3 3 0.723643 0.105813 0.884290 0.589643 0.913065 4 4 0.654378 0.400152 0.763818 0.416423 0.847861 需要一个utf-8编码的字符串:当你将它传递给MySQL时,你需要将它编码为utf-8,只需要执行str()就会尝试将其编码为ascii,它会失败并产生你的错误:

cur.execute()

作为一个 cur.execute("INSERT INTO articles (title, description, date, \ category, link, source) VALUES ('"+ \ urlnzz.entries[i].title.encode('utf-8') +" ', ' " + \ urlnzz.entries[i].description.encode('utf-8') + " ', ' " + \ urlnzz.entries[i].published + " ', ' " + \ urlnzz.entries[i].category + " ', ' " + urlnzz.entries[i].link + " ', 'NZZ')") 对象与utf-8编码中的str不同。 unicode对象上的encode方法将生成utf-8格式的unicode(假设Python 2)

答案 1 :(得分:0)

RSS源中的文本中可能存在其他编码字符。 首先,您可以在嵌套的try除了块之外尝试不同的编码。其次,你可以添加&#39;忽略&#39;编码方法。像:

try:
    s = raw_s.encode('utf-8', 'ignore')
except UnicodeEncodeError:
    try:
        s = raw_s.encode('latin-1', 'ignore')
    except UnicodeEncodeError:
        print raw_s

希望这有帮助。

答案 2 :(得分:0)

主要问题是您在Unicode对象上调用is.read(reinterpret_cast<char*>(data), sizeof(*data));。根据许多因素,这可能导致Python尝试将Unicode编码为ASCII,这对于非ASCII字符是不可能的。

您应该尽可能长时间地将Unicode对象保留为Unicode对象,并且只有在完全必要时才进行转换。幸运的是,MySQL驱动程序符合Unicode,因此您可以传递Unicode字符串,它将在内部进行编码。您唯一需要做的就是告诉驱动程序使用UTF-8。 Feedparser也符合Unicode,并且自动将rss feed解码为Unicode字符串(没有编码的字符串)。

您的代码的某些部分也会受益于在str()for each in something:和三重引号(String.format()等内置功能中使用Python )长篇文章。

将这些全部拉到一起看起来像:

"""