我正在尝试为学校项目创建一个新闻应用程序,我可以从我当地报纸的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()
答案 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 )长篇文章。
将这些全部拉到一起看起来像:
"""