你如何检查'使用scrapy的FormRequest复选框?

时间:2017-08-10 08:04:05

标签: python forms scrapy

我正在处理https://www.fbo.gov/index?s=opportunity&tab=search&mode=list处找到的表单。

我需要通过检查表单上该组中的一个或多个复选框来获取结果。根据我的理解,只需给出一个复选框元素'已选中' attribute表示一个复选框。如何在FormRequest中定义它?

这是我正在测试的输入元素

<div id="div_dnf_class_values_procurement_notice__naics_code___0001_check" ><input name="dnf_class_values[procurement_notice][naics_code][]" type="checkbox" value="0001" alt="NAICS Code: 111 -- Crop Production" title="NAICS Code: 111 -- Crop Production" id="dnf_class_values_procurement_notice__naics_code___0001_check" class="input-checkbox"><label for="dnf_class_values_procurement_notice__naics_code___0001_check">111 -- Crop Production</label></div>

表单使用POST方法。这是我目前的代码:

import scrapy


class ContractsSpider(scrapy.Spider):
    name = "contracts"

    def start_requests(self):
        url = 'https://www.fbo.gov/index?s=opportunity&tab=search&mode=list'

        yield scrapy.Request(url=url, callback=self.parse)


    def parse(self, response):
            yield scrapy.FormRequest.from_response(
            response,
            formdata={'dnf_class_values[procurement_notice][naics_code][]' : '0001',
                      'dnf_class_values[procurement_notice][searchtype]' : 'active',
                      'dnf_class_values[procurement_notice][all_agencies]' : 'all',
                      'dnf_class_values[procurement_notice][recovery_act]' : '0'},
            formname='vendor_procurement_notice_search',
            callback=self.after_form,
            method="POST",
        )

    def after_form(self, response):
        filename = 'response.html'
        with open(filename, 'wb') as f:
            f.write(response.body)
        self.log('Saved file %s' % filename)
        return response

我是scrapy的新手,对于我的formdata属性应该包含哪些内容非常困惑? dict中的额外元素只是表单中所需的现场放射性物体。不确定是否需要在此处添加。 scrapy的FormRequest文档非常简单,我遇到了很多麻烦。

我按照下面其中一个答案的建议使用了输入元素的名称,但是有很多带有该名称的输入元素。另外,如何在一次提交中检查多个复选框?

我希望after_form函数将结果html写入文件,因此我知道它有效。

1 个答案:

答案 0 :(得分:0)

要发送选中复选框的表单,您的表单数据应包含此键值对:'dnf_class_values[procurement_notice][naics_code][]': '0001',这是输入元素的名称值(复选框)。