我正在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)
但我有同样的问题。
答案 0 :(得分:3)
您正在将Unicode字符串插入字节字符串:
body += '<h3 class="post-title">{}</h3>'.format(post.title)
body += '<div class="post-body">{}</div>'.format(post.summary_detail.value)
post.title
和post.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,而不是创建很多小字符串。