【问题标题】:scrapy FormRequest True/False on/'off' Checked Boxesscrapy FormRequest True/False on/'off' 复选框
【发布时间】:2018-02-04 20:54:16
【问题描述】:

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

这在 scrapy 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'、'&lt;None&gt;' 和 ''。
它们的值为 [*on]
目标是关闭它们(?)(取消选中它们)

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

这将返回一个表单,其中包含每个表单数据的修改框。 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': '')  

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

【问题讨论】:

  • 不是复选框发送string 'on'string 'off'吗?
  • @Sjaak Trekhaak:这就是我的想法,但 FormRequest.from_response 不断抛出错误。

标签: forms checkbox scrapy


【解决方案1】:

复选框与其他任何输入字段一样,即它具有value 属性,该属性被发送到服务器。唯一的区别是,如果不勾选,则根本不发送,如果勾选,则与其他字段一起发送。我的意思是服务器通常通过简单地检查其名称是否在表单数据中来检查复选框是否被选中。

您想“取消选中”名为“live”的复选框。这意味着,它根本不必发送到服务器。

我会使用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'] 不会被设置。

【讨论】:

  • 如果默认选中某些复选框怎么办?因此,当您加载网页时,表单会提供选中的框(默认情况下这些框已选中)。目标是重新提交表单,选中某些框,而其他框不选中。
  • 然后像MyFormRequest.from_response(response, formname='form', formdata = {'live': None}) 这样的平滑应该可以工作。 formdata dict 中带有 None 值的键将从发送到服务器的表单数据中排除。
  • 我没有什么要补充的。看看我的小更新
猜你喜欢
  • 2014-06-17
  • 1970-01-01
  • 2019-03-25
  • 1970-01-01
  • 2011-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-30
相关资源
最近更新 更多