2012-01-12 15 views
14

Tôi có một đoạn mã như thế nàyurllib2 Lỗi 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) 

và khi tôi nhập vào một truy vấn lớn hơn một từ như "con chó" tôi nhận được lỗi sau.

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 

Bất kỳ ai có thể chỉ ra những gì tôi đang làm sai? Cảm ơn trước.

+0

Tôi cũng đã nhận được "urllib2.HTTPError: Lỗi HTTP 406: Không thể chấp nhận" khi cố yêu cầu URL có khoảng trắng. – jamesc

Trả lời

53

Lý do khiến "con chó" trả về lỗi 400 là vì bạn không thoát chuỗi cho URL.

Nếu bạn làm điều này:

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) 

Nó sẽ làm việc.

Tuy nhiên, tôi khuyên bạn nên sử dụng requests thay vì sử dụng urllib/urllib2/httplib. Nó dễ dàng hơn nhiều và nó sẽ xử lý tất cả điều này cho bạn.

Đây là mã tương tự với yêu cầu python:

import requests 

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

Tôi thích đề xuất của bạn! cảm ơn! –

5

Bạn cần phải sử dụng urllib.quote() trên biến 'truy vấn' của bạn:

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

này không URL cần thiết thoát để chuyển đổi không gian trong big dog-big%20dog.

-1

Tôi cũng gặp phải vấn đề tương tự. Hóa ra vấn đề là phương pháp đã được thiết lập không thích hợp. Khi bạn bao gồm dữ liệu được mã hóa url trong urllib2.urlopen(), phương thức nên được đặt thành POST và khi bạn loại trừ nó, phương thức sẽ là GET. Vì vậy, làm thế nào để bạn thiết lập phương pháp này là đưa ra dưới đây:

Đối POST yêu cầu

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 

Đối với yêu cầu 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 

này sẽ thiết lập phương thức yêu cầu url của bạn để phù hợp phương pháp cần thiết