1

我真的很接近拥有一个从纽约时报 API 获取 JSON,然后将其转换为 CSV 的脚本。但是,有时我会收到此错误:

UnicodeEncodeError:“ascii”编解码器无法在位置 21 编码字符 u'\u201c':序数不在范围内(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)
4

2 回答 2

1

一些东西...

  • 我对 NewYork Times API 一无所知,但我猜您可能不应该使用您的“api-key”发布代码片段。只是对这一点的猜测(我以前从未使用过这个 API)

  • 如果您查看,API 会告诉您编码。您将在标题中返回以下内容:

    Content-Type=application/json; charset=UTF-8 
    
  • 谷歌搜索“python and UnicodeEncodeError”会给你很多帮助。但是在这里,您的问题似乎可能是在评论中调用“str”。在这种情况下,它将使用“ascii”编解码器。如果有 128 以上的字符,则繁荣。你得到你所看到的错误。 是一篇关于该主题的非常好的博客文章。它可能会帮助您阅读它。

编辑:这个解决方案对我有用:

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)
于 2012-10-05T04:06:31.943 回答
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)
于 2012-10-05T04:41:55.197 回答