2012-10-05 53 views
1

我真的很接近从纽约时报API获取JSON的脚本,然后将其转换为CSV。但是,有时我得到这个错误:将ASCII输出转换为UTF-8

我想我可以逃避这一切在一起,如果我转换输出为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

完整的错误跟踪是什么样的?错误来自哪里? –

+0

21行,在 writer.writerow(row) –

回答

1

一些东西......

  • 我不知道的纽约时报API什么,但我猜你可能不应该发布代码与您的“api键”片段。只是猜测这一点(我从来没有使用过此API)

  • 如果你看,API是告诉你的编码。你得到如下回到标题:

    Content-Type=application/json; charset=UTF-8 
    
  • 谷歌搜索“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) 
+0

我实际上认为它正在被解析正确的Unicode和错误是在'str'调用之一,这就是为什么我要求澄清。 –

+0

@MarkRansom - 是的。我敢打赌你可能是对的。但是,我想指出他已经发布了他的密钥(我猜测它应该是私有的),并且他可以通过查看响应头来找出编码。他似乎在猜测他在这里处理的是什么编码。我会改变我的答案。 –

+0

你说得对,我应该隐藏钥匙,但他们确实没有价值。任何有电子邮件的人都可以得到一个当我将编码更改为unicode时,我仍然遇到同样的错误。 –

0

更换第二和第三调用STR()使用Unicode()。

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)