代码之家  ›  专栏  ›  技术社区  ›  Denis Palnitsky

特定语言重定向

  •  1
  • Denis Palnitsky  · 技术社区  · 14 年前

    我想创建一个简单的应用程序来检测短语的语言(使用Google API),并将其发送到相应的搜索引擎。例如,如果搜索查询是俄语的,那么我需要将它重定向到Yandex.ru,在所有其他情况下都重定向到Google。

    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])
    

    当我请求这个url“http://findinrightplace.appspot.com/q?test query“它重定向到google,但重定向到yandex不起作用(http://findinrightplace.appspot.com/q?·°).

    我做错什么了?

    4 回复  |  直到 14 年前
        1
  •  0
  •   Martin v. Löwis    14 年前

    假设查询字符串是windows-1251编码的,这是不正确的。在您提供的链接中,如何对其进行编码取决于web浏览器(因为HTTP对于url的编码应该是什么也没有说明)。然而,今天,大多数浏览器都假设URL必须用UTF-8编码。由于language/detect还假设查询字符串是UTF-8编码的(并且URL转义),因此根本不需要对字符串进行反引号或解码。此外,yandex还支持UTF-8编码的查询字符串。所以把这些放在一起:试试

    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])
    
        2
  •  1
  •   Scott    14 年前

    您需要将quote()从 url = "http://ajax.googleapis.com/ajax/services/language/detect?v=1.0&q="+ quote(text) ,它为您的俄语查询返回了一个错误的结果。

        3
  •  0
  •   Travis Webb    14 年前

    我建议使用Google预测API[ http://code.google.com/apis/predict/ ]. 你会注意到主页上的例子正是你想要做的。

        4
  •  0
  •   adw    14 年前

    你没有引用 text 建造时 redirectUrl . 尝试:

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