3

私はPythonを学んでおり、現在自分で設定しているプロジェクトには、ネットに接続されたラップトップからの質問の送信、MIT START NLPデータベースへの接続、質問の入力、応答の取得、および応答の表示が含まれます。docs.python.orgの「HOWTOFetchInternetResources Using urllib2」を読みましたが、このアイデアの心に訴える部分が欠けているようです。これが私のコードです:

import urllib
import urllib2

question = raw_input("What is your question? ")

url = 'http://start.csail.mit.edu/'
values = question

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

print the_page

そして、これが私が得ているエラーです:

トレースバック(最後の最後の呼び出し):ファイル "mitstart.py"、9行目、データ= urllib.urlencode(values)ファイル "/usr/lib/python2.7/urllib.py"、1298行目、urlencodeはTypeErrorを発生させますTypeError:有効な非文字列シーケンスまたはマッピングオブジェクトではありません

だから私はvalesで質問を設定する方法が間違っていたと思っているので、私はしました

values = {question}

values = (question)

values = ('question')

喜びもなく。

(私は知っています、そして私の応答は「私は学んでいます、それは遅いです、そして私がこれを理解しようとしている間に突然私の妻は彼女が些細なことについて私に話す必要があると決めました)

ガイダンスを得ることができますか、または少なくとも正しい方向に向けることができますか?

4

2 に答える 2

2

エラーは次のようになっていることに注意してください。TypeError: not a valid non-string sequence or mapping object

したがって、values文字列として作成している間は、非文字列シーケンスまたはマッピングオブジェクトが必要です。

urlencodingにはキーと値のペア(マッピングオブジェクトやdictなど)が必要なため、通常は辞書を渡します。

フォームのソースを見ると、次のことがわかります。

<input type="text" name="query" size="60">

これは、次のようなdictを作成する必要があることを意味します。

values = { 'query': 'What is your question?' }

次に、それをurlencode()の引数として渡すことができるはずです。

于 2012-08-02T03:36:40.557 に答える
1

urllib.urlencode()文字列を引数として受け入れません。

@ernieが言ったように、queryパラメータを指定する必要があります。また、URLには/startfarm.cgi一部がありません:

<form method="post" action="startfarm.cgi">

更新された例:

import cgi
from urllib import urlencode
from urllib2 import urlopen

data = urlencode(dict(query=raw_input("What is your question?"))).encode('ascii')
response = urlopen("http://start.csail.mit.edu/startfarm.cgi", data)

# extract encoding from Content-Type and print the response
_, params = cgi.parse_header(response.headers.get('Content-Type', ''))
print response.read().decode(params['charset'])
于 2012-08-02T06:37:59.850 に答える