0

Python 3を使用してフォームを送信しようとしています。Python2では、次のことを行いました。

br=mechanize.Browser()
br.set_handler_robots(False)  
br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')]  
br.open(url)  
br.select_form(nr=0)  
br.form['form_name']=entry  
br.submit()

できます。Python 3では、次のコードを使用してそれを実行しようとしました。

data={'form_name':entry}  
data=urllib.parse.urlencode(data)  
data=data.encode('utf-8')
headers={'User-Agent': 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1'}  
req=urllib.request.Request(url,data,headers)  
response=urllib.request.urlopen(req)

しかし、HTTPエラー405が表示されています。Python3でそれを解決する方法を誰かが説明できますか?

4

1 に答える 1

0

HTTP エラー 405 はMethod Not Allowedであるため、おそらくその URL への POST は許可されていません。

データを渡すと、HTTP メソッドがurllib.request.Request自動的に POST に変更されますが、フォーム パラメータを URL に追加することで GET を介してフォームを送信することもできます。これはおそらく Web サイトが期待していることです。<form>タグの属性が HTML で「get」に設定されているかmethodどうかを確認します (または、完全に欠落している場合、デフォルトで「get」になります)。

次のように、フォーム パラメータを URL に手動で追加できます。

data = urllib.parse.urlencode(data)
req = urllib.request.Request("%s?%s" % (url, data), headers=headers)

(これはハックですが、ドキュメントの例として使用されているため、推奨される方法だと思います。)

コンストラクターにデータを渡さないので、使用するメソッドは GET になります。

それはうまくいくかもしれません。ただし、Web サーバーは任意のステータス コードを自由に返すことができるため、問題はまったく別のものである可能性があります。

于 2013-02-24T07:22:26.677 に答える