【问题标题】:How to handle urls in python urllib2 appengine with plus signs?如何处理带有加号的python urllib2 appengine中的url?
【发布时间】:2013-06-04 22:54:00
【问题描述】:

这是我的问题。我正在尝试从烂番茄 API 请求一个 url。现在的问题是,他们要求您的电影标题在应该有空格的地方包含 + 符号。但是我不确定如何在应用引擎端实现这一点,因为每当我尝试在应用引擎上做同样的事情时,我都会得到同样的错误:

回溯(最近一次通话最后): __call__ 中的文件“/programming/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/webapp2-2.5.2/webapp2.py”,第 1535 行 rv = self.handle_exception(请求,响应,e) __call__ 中的文件“/programming/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/webapp2-2.5.2/webapp2.py”,第 1529 行 rv = self.router.dispatch(请求,响应) 文件“/programming/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/webapp2-2.5.2/webapp2.py”,第 1278 行,位于 default_dispatcher 返回 route.handler_adapter(请求,响应) __call__ 中的文件“/programming/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/webapp2-2.5.2/webapp2.py”,第 1102 行 返回 handler.dispatch() 文件“/programming/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/webapp2-2.5.2/webapp2.py”,第 572 行,在调度中 return self.handle_exception(e, self.app.debug) 文件“/programming/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/webapp2-2.5.2/webapp2.py”,第 570 行,在调度中 返回方法(*args, **kwargs) 文件“/Users/student/Desktop/Movie Rater/MovieRaterBackend/higgsmovies.py”,第 12 行,在 get page = urllib2.urlopen(站点) 文件“/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py”,第 126 行,在 urlopen return _opener.open(网址,数据,超时) 文件“/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py”,第 400 行,打开 响应=方法(请求,响应) http_response 中的文件“/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py”,第 513 行 'http', 请求, 响应, 代码, msg, hdrs) 文件“/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py”,第 438 行,错误 返回 self._call_chain(*args) _call_chain 中的文件“/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py”,第 372 行 结果 = 函数(*args) http_error_default 中的文件“/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py”,第 521 行 引发 HTTPError(req.get_full_url(), 代码, msg, hdrs, fp) HTTPError:HTTP 错误 400:错误请求

这是我的代码:

    title = self.request.get("title")
    site = "http://api.rottentomatoes.com/api/public/v1.0/movies.json?apikey=" + constants.ROTTEN_TOMATOES_KEY + "&q=" + title + "&page_limit=1"
    page = urllib2.urlopen(site)
    soup = BeautifulSoup(page)
    self.response.out.write(soup)

constants 只是一个包含我所有密码和东西的 python 文件,我正在使用漂亮的汤来清理东西,但我确信这不是问题。只需访问 url myapplication.com/about?title=your+title+goes+here 即可访问此代码,其中 myapplication 将是网站的 url,可能是一些 appspot.com url。

这适用于不包含 + 号的 URL。

任何帮助将不胜感激!

【问题讨论】:

  • 你是如何构建title 字符串的?您是否只是用加号替换所有空格?是否在您请求之前对其进行了 URL 编码?
  • 不,我没有对其进行编码,但我尝试用 %2B 替换每个加号,如果这就是你的意思,那似乎也不起作用
  • 那么我该如何处理它们呢?

标签: python google-app-engine urllib2


【解决方案1】:

这并不能直接回答您的问题,但您是否尝试过直接使用url fetch service

例如:

from google.appengine.api import urlfetch

title = self.request.get("title")
site = "http://api.rottentomatoes.com/api/public/v1.0/movies.json?apikey=" + constants.ROTTEN_TOMATOES_KEY + "&q=" + title + "&page_limit=1"

result = urlfetch.fetch(site)

【讨论】:

  • 这似乎也不起作用,我认为这一定是从带有 + 符号的 url 获取输入。我做了一个快速修复,我使用了一组随机字符,比如“ijaodfiadsf”,所以你会得到“ManijaodfiadsfOfijaodfiadsfSteel”,然后我把它改成一个字符串,比如“Man+Of+Steel”,替换所有'ijaodfiadsf's with '+'s,它现在可以工作。
【解决方案2】:

加号(“+”)是表单数据编码标准的一部分:application/x-www-form-urlencoded

查询字符串,即问号(“?”)之后的所有内容,是表单数据——或者,在本例中,是 REST 查询参数。所以他们的 API 在这里表现正确。

【讨论】:

  • 但这并没有回答我的问题,也没有为我的问题提供任何解决方案。
【解决方案3】:

我还没有找到处理加号的方法,因为 appengine 似乎推断这些是新变量/值。但是,使用“+”以外的正则表达式作为整体问题的可行解决方案,只要访问 URL 的应用程序能够用 [regex] 而不是普通的“+”替换 [space]s。鉴于此服务的预期应用程序是作为 iPhone 应用程序的后端,这种方法应该不会有太大的麻烦。我只需要确保我的正则表达式不包含在任何电影名称中,并且它不会太长。对于使用 appengine 将此类数据转发到另一个在线服务的 Web 应用程序,可以编写一个 javascript 脚本来正确处理。

【讨论】:

    【解决方案4】:

    我使用urllib.urlencode

    例子:

    params = { 'q' : 'value', 'apikey' : key_value }
    
    request_url += urllib.urlencode(params)
    
    urllib2.urlopen(request_url)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-09-20
      • 2011-02-12
      • 2010-11-29
      • 2014-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多