0

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

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

EDIT
例如,使用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>'和' pl '。
它们的值为[*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': '')  

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

4

1 回答 1

1

Checkbox 和其他的一样是一个输入字段,即它有一个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.

是一个未选中复选框的示例:

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

于 2012-07-10T04:37:21.487 回答