web-dev-qa-db-fra.com

erreur HTTP urllib2 400: requête incorrecte

J'ai un morceau de code comme ça 

Host = 'http://www.bing.com/search?q=%s&go=&qs=n&sk=&sc=8-13&first=%s' % (query, page)
req = urllib2.Request(Host)
req.add_header('User-Agent', User_Agent)
response = urllib2.urlopen(req)

et quand je saisis une requête supérieure à un mot comme "le chien", j'obtiens l'erreur suivante.

response = urllib2.urlopen(req)
File "/usr/lib/python2.7/urllib2.py", line 126, in urlopen
return _opener.open(url, data, timeout)
File "/usr/lib/python2.7/urllib2.py", line 400, in open
response = meth(req, response)
File "/usr/lib/python2.7/urllib2.py", line 513, in http_response
'http', request, response, code, msg, hdrs)
File "/usr/lib/python2.7/urllib2.py", line 438, in error
return self._call_chain(*args)
File "/usr/lib/python2.7/urllib2.py", line 372, in _call_chain
result = func(*args)
File "/usr/lib/python2.7/urllib2.py", line 521, in http_error_default
raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
urllib2.HTTPError: HTTP Error 400: Bad Request

Quelqu'un peut-il indiquer ce qui ne va pas??. Merci d'avance.

19
PyFan

La raison pour laquelle "le chien" renvoie une erreur 400 est parce que vous n'échappez pas à la chaîne pour une URL. 

Si tu fais ça:

import urllib, urllib2

quoted_query = urllib.quote(query)
Host = 'http://www.bing.com/search?q=%s&go=&qs=n&sk=&sc=8-13&first=%s' % (quoted_query, page)
req = urllib2.Request(Host)
req.add_header('User-Agent', User_Agent)
response = urllib2.urlopen(req)

Ça va marcher.

Cependant, je vous suggère fortement d'utiliser request au lieu d'utiliser urllib/urllib2/httplib. C'est beaucoup plus facile et cela gèrera tout cela pour vous.

C'est le même code avec les requêtes python:

import requests

results = requests.get("http://www.bing.com/search", 
              params={'q': query, 'first': page}, 
              headers={'User-Agent': user_agent})
58
ravenac95

Vous devez utiliser urllib.quote() sur votre variable 'query':

query = urllib.quote(query)
Host = 'http://www.bing.com/search?q=%s&go=&qs=n&sk=&sc=8-13&first=%s' % (query, page)

Cela évite l'URL nécessaire pour convertir l'espace dans big dog en big%20dog.

5
Zachary Young

vous devez utiliser urllib.quote

3
Xavier Combelle

J'ai aussi rencontré le même problème. Il s'avère que le problème est que la méthode a été définie de manière inappropriée. Lorsque vous incluez des données encodées dans urllib2.urlopen (), la méthode doit être définie sur POST et lorsque vous l'excluez, méthode doit être GET. Alors, comment définissez-vous la méthode est donnée ci-dessous:

Pour POST demande

request_object = urllib2.Request(url)
method = ("POST", "GET")
request_object.get_method = lambda: method[0] #If method is set to POST
url_handle = opener.open(req, data) #If method is set to POST

Pour demande GET

request_object = urllib2.Request(url)
method = ("POST", "GET")
request_object.get_method = lambda: method[1] #If method is set to GET
url_handle = opener.open(req) #If method is set to GET

Ceci définira votre méthode de demande d’URL sur la méthode requise appropriée

0
theBuzzyCoder