我正在处理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写入文件,因此我知道它有效。
答案 0 :(得分:0)
要发送选中复选框的表单,您的表单数据应包含此键值对:'dnf_class_values[procurement_notice][naics_code][]': '0001'
,这是输入元素的名称值(复选框)。