在Python中返回utf8 json类型

时间:2016-01-04 14:59:56

标签: python json

我正在Flask中创建一个RSS阅读器应用程序。在我的程序中,我通过feedparser包获取Feed数据,我想以JSON格式返回数据。 我的代码在英文网站上运行良好但是当我想要获取没有英文提要时,我收到以下错误:

UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-3: ordinal not in range(128)

@app.route('/fetch',methods=['POST'])
def fetch():
    url = request.form['url']
    feed = feedparser.parse(url)
    output = {'response':'','result':''}
    body = ''
    for post in feed.entries:
        body += '<div class="post">'
        body += '<h3 class="post-title">{}</h3>'.format(post.title)
        body += '<div class="post-body">{}</div>'.format(post.summary_detail.value)
        body += '</div>'

    output['response'] = 'ok'
    output['result'] =   body  
    return json.dumps(output, ensure_ascii=False).encode('utf8')

我试过了:

    output['result'] =   body.encode('utf8')  
    return json.dumps(output, ensure_ascii=False)

但我有同样的问题。

1 个答案:

答案 0 :(得分:3)

您正在将Unicode字符串插入字节字符串:

body += '<h3 class="post-title">{}</h3>'.format(post.title)
body += '<div class="post-body">{}</div>'.format(post.summary_detail.value)

post.titlepost.summary_detail.value都需要编码为字节才能生成,而Python则使用ASCII。这就是您在此处收到编码错误的原因。

改为创建一个Unicode字符串:

body = []
for post in feed.entries:
    body.append(
        u'<div class="post">'
        u'<h3 class="post-title">{}</h3>'
        u'<div class="post-body">{}</div>'
        u'</div>'.format(post.title, post.summary_detail.value)
 body = u''.join(body)

上面使用str.join()来连接你的div,而不是创建很多小字符串。