Je travaille sur une petite application utilisant Google App Engine qui utilise le flux RSS Quora. Il existe un formulaire, et basé sur l'entrée entrée par l'utilisateur, il affichera une liste de liens liés à l'entrée. Maintenant, les applications fonctionnent bien pour les requêtes à une lettre et la plupart des mots à deux lettres si les mots sont séparés par un "-". Cependant, pour les mots de trois lettres et certains mots de deux lettres, j'obtiens l'erreur suivante:
UnicodeDecodeError: le codec 'ascii' ne peut pas décoder l'octet 0xe2 en position 48: l'ordinal n'est pas dans la plage (128)
Voici mon Python:
import os
import webapp2
import jinja2
from google.appengine.ext import db
import urllib2
import re
template_dir = os.path.join(os.path.dirname(__file__), 'templates')
jinja_env = jinja2.Environment(loader = jinja2.FileSystemLoader(template_dir), autoescape=True)
class Handler(webapp2.RequestHandler):
def write(self, *a, **kw):
self.response.out.write(*a, **kw)
def render_str(self, template, **params):
t = jinja_env.get_template(template)
return t.render(params)
def render(self, template, **kw):
self.write(self.render_str(template, **kw))
class MainPage(Handler):
def get(self):
self.render("formrss.html")
def post(self):
x = self.request.get("rssquery")
url = "http://www.quora.com/" + x + "/rss"
content = urllib2.urlopen(url).read()
allTitles = re.compile('<title>(.*?)</title>')
allLinks = re.compile('<link>(.*?)</link>')
list = re.findall(allTitles,content)
linklist = re.findall(allLinks,content)
self.render("frontrss.html", list = list, linklist = linklist)
app = webapp2.WSGIApplication([('/', MainPage)], debug=True)
Voici le code html:
<h1>Quora Live Feed</h1><br><br><br>
{% extends "rssbase.html" %}
{% block content %}
{% for e in range(1, 19) %}
{{ (list[e]) }} <br>
<a href="{{ linklist[e] }}">{{ linklist[e] }}</a>
<br><br>
{% endfor %}
{% endblock %}
Python essaie probablement de décoder une chaîne unicode en une chaîne normale avec le codec ascii et échoue. Lorsque vous travaillez avec des données unicode, vous devez les décoder:
content = content.decode('utf-8')
Dans mon application AppEngine, je la convertis comme:
content = unicode(content)
Je pense que c'est plus clair et facile à utiliser.