3

我正在学习 Python,我目前自己设置的项目包括从连接到网络的笔记本电脑发送一个问题,连接到MIT START NLP 数据库,输入问题,检索响应并显示响应。我已经阅读了 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

这是我得到的错误:

回溯(最后一次调用):文件“mitstart.py”,第 9 行,在 data = 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 需要键值对(例如映射对象或字典),因此您通常将其传递给字典。

查看表单的源代码,您会看到:

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

这意味着您应该创建一个字典,例如:

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

然后你应该能够将它作为参数传递给 urlencode()。

于 2012-08-02T03:36:40.557 回答
1

urllib.urlencode() doesn't accept a string as an argument.

As @ernie said you should specify query parameter. Also the url is missing the /startfarm.cgi part:

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

Updated example:

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 回答