Python中无名称属性的表单提交

2 投票
2 回答
3843 浏览
提问于 2025-04-15 11:27

背景:

在Python中使用urllib和urllib2,你可以提交表单。

首先,你需要创建一个字典。

formdictionary = { 'search' : 'stackoverflow' }

然后,你可以用urllib的urlencode方法把这个字典转换成适合网页提交的格式。

params = urllib.urlencode(formdictionary)

接下来,你可以用urllib2发起一个网址请求,把变量params作为第二个参数传入,第一个参数是网址。

open = urllib2.urlopen('www.searchpage.com', params)

根据我的理解,urlencode会自动把字典编码成HTML格式,并添加输入标签。字典中的键会被当作name属性,值则是name属性的值。然后,urllib2会通过HTTP POST请求发送这个HTML代码。

问题:

如果你提交的HTML代码格式标准,输入标签都有name属性,那这样是没问题的。

<input id="32324" type="text" name="search" >

但是,如果HTML代码格式不正确,输入标签只有id属性而没有name属性,那该怎么办呢?有没有其他方法可以通过id属性来访问输入标签?或者还有其他的解决办法吗?

解决方案:

?

2 个回答

0

如果一个输入框没有名字,它就不会被当作表单参数提交。

比如,创建一个只包含以下内容的HTML页面:

<form>
    <input type="text" name="one" value="foo"/>
    <input type="text" value="bar"/>
    <input type="submit"/>
</form>

你会发现第二个文本框缺少一个 name 属性。如果你点击“提交”,页面会刷新,并显示查询字符串:

test.html?one=foo

一个好的方法是查看浏览器发送的实际POST请求,然后模仿这个请求。可以使用像Firefox的FireBug扩展这样的工具,查看浏览器发送的POST请求和参数。里面可能有一些你之前没注意到的参数——可能是因为它们是隐藏的表单元素,或者是由JavaScript创建或设置的。

2

根据W3标准,一个输入框要被提交,必须有一个名字属性。经过在Firefox 3和Safari 3.2上的简单测试发现,如果一个输入框没有名字属性但有id属性,它是不会被提交的。

所以,如果你有一个表单想要提交,而其中一些输入框有id但没有名字属性,那么使用id属性似乎是唯一的选择。可能其他浏览器会使用id属性,或者可能有一些JavaScript代码在处理提交事件,而不是让浏览器自己去处理。

撰写回答