如何使用加号处理python urllib2 appengine中的URL?

如何使用加号处理python urllib2 appengine中的URL?,python,google-app-engine,urllib2,Python,Google App Engine,Urllib2,这是我的问题。我正试图从烂番茄API请求一个url。现在的问题是,他们要求你的电影标题包含+符号,任何地方都应该有空格。但是,我不确定如何在app engine端实现这一点,因为每当我尝试在app engine上执行相同的操作时,都会出现相同的错误: Traceback (most recent call last): File "/programming/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-defau

这是我的问题。我正试图从烂番茄API请求一个url。现在的问题是,他们要求你的电影标题包含+符号,任何地方都应该有空格。但是,我不确定如何在app engine端实现这一点,因为每当我尝试在app engine上执行相同的操作时,都会出现相同的错误:

Traceback (most recent call last): File "/programming/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/webapp2-2.5.2/webapp2.py", line 1535, in __call__ rv = self.handle_exception(request, response, e) File "/programming/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/webapp2-2.5.2/webapp2.py", line 1529, in __call__ rv = self.router.dispatch(request, response) File "/programming/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/webapp2-2.5.2/webapp2.py", line 1278, in default_dispatcher return route.handler_adapter(request, response) File "/programming/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/webapp2-2.5.2/webapp2.py", line 1102, in __call__ return handler.dispatch() File "/programming/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/webapp2-2.5.2/webapp2.py", line 572, in dispatch return self.handle_exception(e, self.app.debug) File "/programming/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/webapp2-2.5.2/webapp2.py", line 570, in dispatch return method(*args, **kwargs) File "/Users/student/Desktop/Movie Rater/MovieRaterBackend/higgsmovies.py", line 12, in get page = urllib2.urlopen(site) File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 126, in urlopen return _opener.open(url, data, timeout) File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 400, in open response = meth(req, response) File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 513, in http_response 'http', request, response, code, msg, hdrs) File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 438, in error return self._call_chain(*args) File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 372, in _call_chain result = func(*args) File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 521, in http_error_default raise HTTPError(req.get_full_url(), code, msg, hdrs, fp) HTTPError: HTTP Error 400: Bad Request constants只是一个python文件,包含我所有的密码和东西,我正在使用Beauty soup来清理这些东西,但我确信这不是问题所在。这段代码只需转到url myapplication.com/about?title=your+title+goes+此处即可访问,其中myapplication将是网站的url,可能是某个appspot.com url

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


任何帮助都将不胜感激

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

例如:

加号(“+”)是表单数据编码标准的一部分:


查询字符串(位于问号(“?”)之后)是表单数据,在本例中是REST查询参数。所以他们的API在这里运行正常。

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

我使用
urllib.urlencode

例如:

params = { 'q' : 'value', 'apikey' : key_value }

request_url += urllib.urlencode(params)

urllib2.urlopen(request_url)

如何构建
标题
字符串?您只是简单地用加号替换所有空格吗?在您请求它之前,它是否已被URL编码?不,我没有编码它,但我尝试用%2B替换每个加号,如果这是您的意思,那么这似乎不起作用。我该如何处理它们?这似乎也不起作用,我想一定是从带有+号的URL中获取输入。我做了一个快速修复,我使用了一组随机字符,比如'ijaodfiadsf',这样你就可以得到'manijaodfiadsfoffijaodfiadsfsteel',然后我把它改成一个字符串,比如'Man+of+Steel',用'+'替换所有的'ijaodfiadsf',它现在可以工作了。但这不能回答我的问题,也不能为我的问题提供任何解决方案。
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)
params = { 'q' : 'value', 'apikey' : key_value }

request_url += urllib.urlencode(params)

urllib2.urlopen(request_url)