scrapy FormRequest真/假/'关'选中框

时间:2012-07-09 23:03:44

标签: forms checkbox scrapy

在一个类似的post中,有一个问题是关于将表单值从[on]更改为not on,这只是设置一个'True'和'False'值(使用Mechanize)。

如何在sc FormRequest.from_response中实现这一目标?

修改
例如,使用mechanize获取表单信息,
这是网页表单附带的默认值 默认情况下,会检查表单上的所有内容:

<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']

请注意' ac ',' <None> '和' < EM> PL ”。
它们的值为 [* on]
目标是将它们“关闭”(?)(取消选中)

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:'False','True','',[''],'on','off'和'None'但似乎无法获得正确的值响应。

有什么建议吗?

修改
尝试过:

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': '')  

默认情况下,网页提供一个包含已选中复选框的表单。目标是提交表单并“关闭”一些只有两个选项的复选框:'on'/'off'

1 个答案:

答案 0 :(得分:1)

Checkbox是一个输入字段,与其他任何字段一样,即它具有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脚本(checkbox-form.php)中,我们可以获取提交的选项   来自$ _POST数组。如果$ _POST ['formWheelchair']是“是”,那么   盒子被检查了。如果未选中该复选框,   <_POST ['formWheelchair']将不会被设置。