2012-01-12 2 views
14

У меня есть кусок кода, как этотurllib2 Ошибка HTTP 400: Bad Request

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) 

и когда я ввести запрос больше, чем одно слово, как «собаки» я получаю следующее сообщение об ошибке.

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 

Может ли кто-нибудь указать, что я делаю неправильно? Спасибо заранее.

+0

Я также получил сообщение «urllib2.HTTPError: HTTP Error 406: Not Acceptable» при попытке запросить URL-адреса с пробелом. – jamesc

ответ

53

Причина, по которой «собака» возвращает ошибку 400, заключается в том, что вы не избегаете строки для URL-адреса.

Если вы сделаете это:

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) 

Он будет работать.

Однако я настоятельно рекомендую использовать requests вместо использования urllib/urllib2/httplib. Это намного проще, и все это вам подойдет.

Это тот же код с запросами питона:

import requests 

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

Мне нравится ваше предложение! благодаря! –

5

Вы должны использовать urllib.quote() на переменную «запроса»:

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

Это делает необходимый URL ускользающей для преобразования пространства в big dog к big%20dog.

-1

Я также столкнулся с той же проблемой. Оказывается, проблема заключалась в том, что метод был установлен неправильно. Когда вы включаете urlencoded данные в urllib2.urlopen(), метод должен быть установлен в POST, и когда вы его исключите, метод должен быть GET. Итак, как вы установите метод приведен ниже:

Для запроса 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 

Для запроса 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 

Это установит ваш метод URL запроса на соответствующий необходимый метод