【问题标题】:How do you 'check' a checkbox using scrapy's FormRequest?你如何使用scrapy的FormRequest“检查”一个复选框?
【发布时间】:2019-07-09 15:13:53
【问题描述】:

我正在使用https://www.fbo.gov/index?s=opportunity&tab=search&mode=list 上的表格。

我需要通过选中表单上该组中的一个或多个复选框来抓取给出的结果。据我了解,只需给一个复选框元素“checked”属性就代表一个复选框。如何在我的 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"
        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 写入文件,以便我知道它可以工作。

【问题讨论】:

    标签: python forms scrapy


    【解决方案1】:

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

    【讨论】:

    • 这就是我一开始的想法,但在未选中时(加载页面时)它具有该值。此外,所有其他复选框输入具有不同的值。每一个都是独一无二的吗?此外,所有这些输入复选框的名称都与此相同。无论如何我都会试试这个,谢谢!
    • 它不起作用,请查看我对问题详细信息的编辑
    猜你喜欢
    • 1970-01-01
    • 2015-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 2019-03-25
    • 1970-01-01
    • 2019-08-06
    相关资源
    最近更新 更多