我正在学习Python,我自己设置的项目包括从连接到网络的笔记本电脑发送问题,连接到MIT START NLP database,输入问题,检索响应并显示响应。我已经阅读了docs.python.org上的“HOWTO使用urllib2获取Internet资源”,但我似乎错过了一些这个想法。这是我的代码:
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
这是我得到的错误:
Traceback(最近一次调用最后一次):文件“mitstart.py”,第9行,in data = urllib.urlencode(values)文件“/usr/lib/python2.7/urllib.py”,第1298行,在urlencode中 raise TypeError TypeError:不是有效的非字符串序列或映射对象
所以我认为我在vales中设置问题的方式是错误的,所以我做了
values = {question}
和values = (question)
和values = ('question')
没有快乐。
(我知道,我的回答是“我正在学习,已经很晚了,突然间我的妻子决定在我试图解决这个问题时需要和我谈谈一些微不足道的事情。”
我能获得一些指导,或者至少能指出正确的方向吗?
答案 0 :(得分: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()。
答案 1 :(得分:1)
urllib.urlencode()
不接受字符串作为参数。
正如@ernie所说,你应该指定query
参数。此网址缺少/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'])