2012-07-09 41 views
0

在类似的post问一个关于将表单值从[开]改为不开的问题,这个问题只是设置了'True'和'False'的值使用机械化)。scrapy FormRequest True/False on /'off'Checked Boxes

这将如何在scrapy FormRequest.from_response中完成?

编辑
例如,使用机械化获取形式信息,
这是自带的网页形式的默认。
默认情况下,在表格上的一切检查:

<CheckboxControl(ac=[*on])> 
type=checkbox, name=ac value=['on'] 
<CheckboxControl(<None>=[*on])> 
type=checkbox, name=None value=[] 
<TextControl(p=)> 
type=text, name=p value= 
<CheckboxControl(pr[]=[*0, *1, *2])> 
type=checkbox, name=pr[] value=['0', '1', '2'] 
<CheckboxControl(a[]=[*0, *1, *2, *3, *4])> 
type=checkbox, name=a[] value=['0', '1', '2', '3', '4'] 
<CheckboxControl(pl=[*on])> 
type=checkbox, name=pl value=['on'] 
<CheckboxControl(sp[]=[*1, *2, *3])> 
type=checkbox, name=sp[] value=['1', '2', '3'] 
<SelectControl(pp=[0, 1, *2, 3])> 
type=select, name=pp value=['2'] 

注意 '交流', '<None>' 和 'PL'。
他们有[*上]的值
的目标是将其“关闭”(?)(取消他们)

FormRequest.from_response(response, formnumber=0, formdata={'pr[]': '2', 'sp[]': '3', 'pp': '3', 'a[]': ['3', '4']})) 

这将返回一个形式每FORMDATA修改后的盒子。 尚未检查formdata中提及的那些键。

按照以上职位的例子:

FormRequest.from_response(response, formdata={'live': 'False'}) 

我也做了FormRequest具有多种价值: '假', '真', '',[ ''], '上', '关'和'无',但似乎无法得到正确的回应。

有什么建议吗?

编辑:
有尝试:

FormRequest(url, formdata = {'pl': 'False'}, callback=parse_this) 
FormRequest(url, formdata = {'pl': 'off'}, callback=parse_this) 
FormRequest(url, formdata = {'pl': ''}, callback=parse_this) 
FormRequest(url, formdata = {'pl': 'None'}, callback=parse_this) 
FormRequest(url, formdata = {'pl': None}, callback=parse_this) 

FormRequest.from_response(response, formdata = {'pl': 'False'}) 
FormRequest.from_response(response, formdata = {'pl': 'off'}) 
FormRequest.from_response(response, formdata = {'pl': '') 

默认情况下,该网页提供了包含已选中的复选框的形式。目标是提交表单和'关闭'一些复选框,只有两个选项:'开'/'关'

+0

是不是一个复选框发送''字符串''或'字符串'关''? – 2012-07-10 14:00:47

+0

@Sjaak Trekhaak:这就是我的想法,但FormRequest.from_response一直抛出一个错误。 – user1460015 2012-07-10 19:44:18

回答

1

复选框是一个输入字段像任何其他人,即它有value属性,它发送到服务器。唯一的区别是,如果它没有被检查,它根本不会被发送,并且如果它被选中,它将与其他字段一起被发送。我的意思是服务器通常会检查复选框是否通过检查其名称是否在表单数据中进行检查。

你想“取消”复选框称为'活'。这意味着,它只需要不被发送到服务器。

我会用的FormRequest一个子类(未测试,但你应该明白我的意思):

class MyFormRequest(FormRequest): 
    """FormRequest subclass which filters from form data submitted to the server None values. 
    This allows removing some fields automatically collected from a form by FormRequest.from_response method.""" 

    def __init__(self, *args, **kwargs): 
     formdata = kwargs.get('formdata') 
     if formdata: # filter out input fields with None values 
      formdata = dict((name, value) for name, value in formdata.iteritems() if value is not None) 
      kwargs['formdata'] = formdata 

     super(MyFormRequest, self).__init__(*args, **kwargs) 

然后用MyFormRequest.from_response代替FormRequest.from_response

另一种选择,解决你的问题是构建FormRequest手动将它只传递给需要的数据,而不使用FormRequest.from_response

Here就是一个例子什么用其中的复选框选中有发生:

在PHP脚本(复选框-form.php的),我们可以从$ _POST数组提交的选项 。如果$ _POST ['formWheelchair']是“是”,则检查框 。如果未选中复选框,则不会设置 $ _POST ['formWheelchair']。

+0

如果默认选中某些复选框,该怎么办?因此,当您加载网页时,表单会提供复选框(默认情况下,框已被选中)。目标是重新提交表单,其中一些框已勾选,而其他框未勾选。 – user1460015 2012-07-10 19:42:08

+0

然后像'MyFormRequest.from_response(response,formname ='form',formdata = {'live':None})这样的smith应该可以工作。 'formdata'中带有'None'值的键将从发送到服务器的表单数据中排除。 – warvariuc 2012-07-11 03:57:00

+0

查看我的编辑。 Thx – user1460015 2012-07-11 15:39:54