12

次のコードを使用すると、エラーが発生しました。

TypeError: POST data should be bytes or an iterable of bytes. It cannot be str

2 番目の懸念事項として、ユーザー エージェントを正しく指定したかどうかわかりません。ユーザー エージェント全体を以下に示しMozilla/5.0 (Windows NT 5.1) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.94 Safari/537.4ます。スクリプトでユーザー エージェントを定義する際に最善を尽くしました。

import urllib.parse
import urllib.request

url = 'http://getliberty.org/contact-us/'
user_agent = 'Mozilla/5.0 (compatible; Chrome/22.0.1229.94; Windows NT)'
values = {'Your Name' : 'Horatio',
          'Your Email' : '6765Minus4181@gmail.com',
          'Subject' : 'Hello',
          'Your Message' : 'Cheers'}

headers = {'User-Agent': user_agent }

data = urllib.parse.urlencode(values)
req = urllib.request.Request(url, data)
response = urllib.request.urlopen(req)
the_page = response.read()

この同様の質問TypeError: POST data should be bytes or an iterable of bytes を認識しています。str にすることはできませんが、答えがあまり役に立たないほど新しいです。

4

2 に答える 2

20
data = urllib.parse.urlencode(values)
type(data) #this returns <class 'str'>. it's a string

urllib ドキュメントは次のように述べていurllib.request.Request(url, data ...)ます。

urllib.parse.urlencode() 関数は、2 タプルのマッピングまたはシーケンスを受け取り、この形式で文字列を返します。データ パラメータとして使用する前に、バイトにエンコードする必要があります。などなど

(私のものを強調)

したがって、正しく見える文字列が得られます。必要なのは、その文字列をバイトにエンコードすることです。そして、エンコーディングを選択します。

binary_data = data.encode(encoding)

上記の行で: エンコーディングは、'utf-8' または 'ascii' またはその他のものの束にすることができます。サーバーが期待するものを選択してください。

したがって、最終的には次のようになります。

data = urllib.parse.urlencode(values)
binary_data = data.encode(encoding) 
req = urllib.request.Request(url, binary_data)
于 2012-11-02T21:02:37.640 に答える
4

代替ソリューションとしてリクエストモジュールを試すことができます

import json
import requests

url = 'http://getliberty.org/contact-us/'
user_agent = 'Mozilla/5.0 (compatible; Chrome/22.0.1229.94; Windows NT)'
values = {
      'Your Name' : 'Horatio',
      'Your Email' : '6765Minus4181@gmail.com',
      'Subject' : 'Hello',
      'Your Message' : 'Cheers'
       }

headers = {'User-Agent': user_agent, 'Content-Type':'application/json' }

data = json.dumps(values)
request = requests.post(url, data=data, headers=headers)

response = request.json()
于 2015-12-22T15:21:48.677 に答える