2010-10-26 8 views
1

Je souhaite créer une application simple qui détecte la langue (à l'aide de l'API Google) et l'envoie au moteur de recherche correspondant. Par exemple, si la requête de recherche est en russe, je dois la rediriger vers Yandex.ru dans tous les autres cas vers Google.Redirection spécifique à une langue

Voilà comment je fais:

def get(self):                   
    decoded = unicode(unquote(self.request.query), "windows-1251") 
    text = decoded.encode("utf-8")    
    url = "http://ajax.googleapis.com/ajax/services/language/detect?v=1.0&q="+ quote(text) 

    try: 
     data = json.loads(urllib2.urlopen(url).read())         
     redirectUrl = "http://www.google.com/search?q=" + text       
     if data["responseData"]["language"] == 'ru': 
      redirectUrl = "http://yandex.ru/yandsearch?text=" + text   
     self.redirect(redirectUrl)               
    except urllib2.HTTPError, e: 
     self.response.out.write("HTTP error: %d" % e.code) 
    except urllib2.URLError, e: 
     self.response.out.write("Network error: %s" % e.reason.args[1]) 

Quand je demande cette URL « http://findinrightplace.appspot.com/q?test requête » redirige vers Google, mais la redirection vers yandex ne fonctionne pas (http://findinrightplace.appspot.com/q?тестовый запрос).

Qu'est-ce que je fais mal?

+0

Vous pouvez essayer d'utiliser des outils tels que Firebug ou la console développeur de Chrome pour voir si le serveur renvoie l'en-tête HTTP de redirection. Si c'est le cas, il s'agit de savoir pourquoi le navigateur ignore l'en-tête. –

+0

Il renvoie le code d'état 302. Je crois que quelque chose ne va pas avec l'encodage. –

Répondre

0

Vous avez tort de supposer que la chaîne de requête sera codée sous Windows-1251. Dans le lien que vous donnez, c'est au navigateur Web de savoir comment l'encoder (puisque HTTP est également muet quant à l'encodage des URLs). Cependant, aujourd'hui, la plupart des navigateurs supposeront que l'URL doit être encodée en UTF-8. Comme alors language/detect suppose également que la chaîne de requête est codée en UTF-8 (et que l'URL est échappée), vous n'avez pas besoin de décocher ou de décoder la chaîne du tout. De plus, yandex prend très bien en charge les chaînes de requête codées en UTF-8. Donc, mettre tout cela ensemble: essayer

def get(self):                   
    text = self.request.query 
    url = "http://ajax.googleapis.com/ajax/services/language/detect?v=1.0&q=" + text 

    try: 
     data = json.loads(urllib2.urlopen(url).read())         
     redirectUrl = "http://www.google.com/search?q=" + text       
     if data["responseData"]["language"] == 'ru': 
      redirectUrl = "http://yandex.ru/yandsearch?text=" + text   
     self.redirect(redirectUrl)               
    except urllib2.HTTPError, e: 
     self.response.out.write("HTTP error: %d" % e.code) 
    except urllib2.URLError, e: 
     self.response.out.write("Network error: %s" % e.reason.args[1]) 
0

Je suggère d'utiliser l'API Google Prediction [http://code.google.com/apis/predict/]. Vous remarquerez que l'exemple sur la page principale est exactement ce que vous essayez de faire.

+0

Je ne vois pas comment cela peut m'aider. La détection de la langue Google est suffisante pour moi. J'ai juste besoin de comprendre pourquoi rediriger vers Yandex ne fonctionne pas. –

0

Vous ne citez pas text lors de la construction redirectUrl. Essayez:

... 
    redirectUrl = "http://www.google.com/search?q=" + quote(text) 
    if data["responseData"]["language"] == 'ru': 
     redirectUrl = "http://yandex.ru/yandsearch?text=" + quote(text) 
    ... 
1

Vous devez supprimer citation() de url = "http://ajax.googleapis.com/ajax/services/language/detect?v=1.0&q="+ quote(text), son retour d'un mauvais résultat pour votre requête russe.

J'ai testé votre code dans mon shell python local et cela a fonctionné sans quote(), mais n'a pas fonctionné avec quote().

Questions connexes