私はこのようなコードを持っています
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)
そして、「the dog」のような1ワード以上のクエリを入力すると、次のエラーが表示されます。
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
誰が私が間違っているのかを指摘できますか?前もって感謝します。
「犬」が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 を使用することを強くお勧めします。それははるかに簡単であり、あなたのためにこれらすべてを処理します。
これはpythonリクエストと同じコードです:
import requests
results = requests.get("http://www.bing.com/search",
params={'q': query, 'first': page},
headers={'User-Agent': user_agent})
「クエリ」変数で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)
これは、big dog
のスペースをbig%20dog
に変換するために必要なURLエスケープを行います。
rllib.quote を使用する必要があります
私も同じ問題に遭遇しました。メソッドが不適切に設定されていたことが問題であることが判明しました。 urllib2.urlopen()にurlencodedデータを含める場合、メソッドをPOSTに設定する必要があります。除外する場合、メソッドはGETになります。そのため、メソッドの設定方法を以下に示します。
POST request
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リクエストメソッドが適切な必須メソッドに設定されます。
Python 3.6以降でurllib.requestオブジェクトを使用する方法の例を次に示します。
import urllib.request
import json
from pprint import pprint
url = "some_url"
values = {
"first_name": "Vlad",
"last_name": "Bezden",
"urls": [
"https://Twitter.com/VladBezden",
"https://github.com/vlad-bezden",
],
}
headers = {
"Content-Type": "application/json",
"Accept": "application/json",
}
data = json.dumps(values).encode("utf-8")
pprint(data)
try:
req = urllib.request.Request(url, data, headers)
with urllib.request.urlopen(req) as f:
res = f.read()
pprint(res.decode())
except Exception as e:
pprint(e)