Python中没有名称属性的表单提交

时间:2009-05-07 21:44:49

标签: python forms urllib2 urllib

背景:

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

首先创建一个词典。

formdictionary = { 'search' : 'stackoverflow' }

然后使用urllib的urlencode方法转换这个字典。

params = urllib.urlencode(formdictionary)

您现在可以使用urllib2发出url请求,并将变量params作为辅助参数传递,第一个参数是url。

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

根据我的理解,urlencode会自动对html中的字典进行编码并添加输入标记。它需要键作为name属性。它将字典中的值作为name属性的值。 Urllib2通过HTTP POST请求发送此HTML代码。

问题:

如果您提交的html代码采用标准方式格式化,并且html标记输入具有name属性,那么这是正常的。

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

但是,存在html代码格式不正确的情况。并且html输入标记只有id属性没有name属性。是否有其他方法可以通过id属性访问输入标记?或者还有另一种方式吗?

解决方案:

2 个答案:

答案 0 :(得分:2)

根据the W3 standard,对于要提交的输入字段,它必须具有name属性。对Firefox 3和Safari 3.2的快速测试表明,未提交缺少name属性但具有id属性的输入字段。

话虽如此,如果您有一个要提交的表单,并且其某些字段具有id而不是name属性,则使用id属性似乎是唯一可用的选项。可能是其他浏览器使用id属性,或者可能有一些JavaScript代码处理提交事件而不是让浏览器执行它。

答案 1 :(得分: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创建/设置的。