我真的很接近一个从纽约时报API获取JSON的脚本,然后将其转换为CSV。但是,偶尔我会收到此错误:
UnicodeEncodeError:'ascii'编解码器无法对字符u'\ u201c'进行编码 第21位:序数不在范围内(128)
如果我将输出转换为UTF-8,我想我可以避免这一切,但我不确定如何这样做。这是我的python脚本:
import urllib2
import json
import csv
outfile_path='/NYTComments.csv'
writer = csv.writer(open(outfile_path, 'w'))
url = urllib2.Request('http://api.nytimes.com/svc/community/v2/comments/recent?api-key=ea7aac6c5d0723d7f1e06c8035d27305:5:66594855')
parsed_json = json.load(urllib2.urlopen(url))
print parsed_json
for comment in parsed_json['results']['comments']:
row = []
row.append(str(comment['commentSequence']))
row.append(str(comment['commentBody']))
row.append(str(comment['commentTitle']))
row.append(str(comment['approveDate']))
writer.writerow(row)
答案 0 :(得分:1)
一些事情......
我对NewYork Times API一无所知,但我猜你可能不应该发布带有“api-key”的代码片段。只是猜测这一点(我之前从未使用过这个API)
如果你看,API会告诉你编码。您将在标题中找到以下内容:
Content-Type=application/json; charset=UTF-8
Google搜索“python和UnicodeEncodeError”会给你很多帮助。但在这里,似乎你的问题可能在评论中称为“str”。在这种情况下,它将使用'ascii'编解码器。如果有一个超过128的字符,那么繁荣。你得到了你看到的错误。 Here是关于该主题的非常好的博客文章。它可能会帮助您阅读它。
编辑:此解决方案适合我:
for comment in parsed_json['results']['comments']:
row = []
row.append(str(comment['commentSequence']))
row.append(comment['commentBody'].encode('UTF-8', 'replace'))
row.append(comment['commentTitle'].encode('UTF-8', 'replace'))
row.append(str(comment['approveDate']))
writer.writerow(row)
答案 1 :(得分:0)
用unicode()替换对str()的第二次和第三次调用。
for comment in parsed_json['results']['comments']:
row = []
row.append(str(comment['commentSequence']))
row.append(unicode(comment['commentBody']))
row.append(unicode(comment['commentTitle']))
row.append(str(comment['approveDate']))
writer.writerow(row)