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.
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})
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
.
vous devez utiliser urllib.quote
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