Python中无名称属性的表单提交
背景:
在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 个回答
如果一个输入框没有名字,它就不会被当作表单参数提交。
比如,创建一个只包含以下内容的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创建或设置的。
根据W3标准,一个输入框要被提交,必须有一个名字属性。经过在Firefox 3和Safari 3.2上的简单测试发现,如果一个输入框没有名字属性但有id属性,它是不会被提交的。
所以,如果你有一个表单想要提交,而其中一些输入框有id但没有名字属性,那么使用id属性似乎是唯一的选择。可能其他浏览器会使用id属性,或者可能有一些JavaScript代码在处理提交事件,而不是让浏览器自己去处理。