2012-01-12 5 views
14

은 내가이urllib2가의 HTTP 오류 400 : 잘못된 요청

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) 

과 같은 코드의 조각 때 "개"나는 다음과 같은 오류가 같은 I 입력 쿼리 더 이상의 단어가 있습니다.

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

공백이있는 URL을 요청할 때 "urllib2.HTTPError : HTTP 오류 406 : 사용할 수 없음"도 수신했습니다. – jamesc

답변

53

"dog"가 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) 

이 작동합니다.

그러나 urllib/urllib2/httplib 대신 requests을 사용하는 것이 좋습니다. 훨씬 더 쉬우 며 모든 것을 처리 할 수 ​​있습니다.

이 파이썬 요청과 같은 코드는 다음과 같습니다

import requests 

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

나는 당신의 제안을 좋아한다! 감사! –

3

당신은 당신은 당신의 '쿼리'변수에 urllib.quote()를 사용할 필요가 urllib.quote

5

을 사용해야합니다 :

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

big%20dogbig dog의 공간을 변환 탈출에 필요한 URL을한다.

-1

는 또한 같은 문제가 발생했습니다. 그 방법이 부적절하게 설정되었다는 것이 문제가되었다. urllib2.urlopen()에 urlencoded 데이터를 포함 시키면 메서드가 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 

를 들어이 적절한 필요한 방법으로 URL 요청 방법을 설정합니다

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 

GET 요청에 대한

관련 문제