2012-01-12 27 views
14

que tiene un pedazo de código como esteurllib2 Error HTTP 400: Solicitud incorrecta

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) 

y cuando una consulta de entrada mayor que una palabra como "el perro" me sale el siguiente error.

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 

¿Alguien puede señalar qué estoy haciendo mal? Gracias de antemano.

+0

También recibí "urllib2.HTTPError: HTTP Error 406: No aceptable" al intentar solicitar URL con espacios en blanco. – jamesc

Respuesta

53

La razón por la que "el perro" devuelve un error 400 es porque no está escapando de la cadena de una URL.

Si hace esto:

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) 

Se trabajará.

Sin embargo, le sugiero que use requests en lugar de usar urllib/urllib2/httplib. Es mucho más fácil y manejará todo esto por ti.

Este es el mismo código con las solicitudes de pitón:

import requests 

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

¡Me gusta tu sugerencia! ¡Gracias! –

5

Es necesario utilizar urllib.quote() en la variable 'consulta':

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

Esto hace necesaria la URL escape para convertir el espacio en el que big dogbig%20dog.

-1

También me encontré con el mismo problema. Resulta que el problema fue que el método fue establecido inapropiadamente. Cuando incluye datos urlencoded en urllib2.urlopen() el método debe establecerse en POST y cuando lo excluya, el método debe ser GET. Entonces, ¿cómo se establece el método que se da a continuación:

Por petición POST

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 

Por petición 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 

Esto establecerá el método de la petición URL para el método requerido apropiada

Cuestiones relacionadas