我正在使用请求来访问此webpage,然后使用Beautiful Soup解析和检查HTML。
此页面允许用户指定过去应返回结果的天数。这是通过页面上的表单完成的:
当我在浏览器中提交请求并选择365天并检查响应时,我发现此表单数据随请求一起发送:
值得注意的是表格基准“dnf_class_values [procurement_notice] [_ posted_date]:365”,因为这是与我选择的365天相对应的唯一元素。
当在浏览器中返回此请求时,我得到 n 结果,其中 n 是可能的最大数量,因为这是可能的最大时间段。 n 在标记中显示为<span class="lst-cnt">
。
我似乎无法复制带有请求的表单数据的发送。这是我的代码的相关部分:
import requests
from bs4 import BeautifulSoup as bs
formData = {'dnf_class_values[procurement_notice][_posted_date]':'365'}
r = requests.post("https://www.fbo.gov/index?s=opportunity&mode=list&tab=list&tabmode=list&pp=20&pageID=1", data = formData)
s = bs(r.content)
s.find('span',{'class':'lst-cnt'})
这将返回与提交表单时使用默认值天数相同的结果数。
我已尝试对data
中的密钥进行URL编码,并使用requests.get
,并指定params
而不是data
。另外,我试图将表单数据字段附加为查询字符串参数:
url...?s=opportunity&mode=list&tab=list&tabmode=list&pp=20&pageID=1&dnf_class_values%5Bprocurement_notice%5D%5B_posted_date%5D=365
该请求的适当语法是什么?
答案 0 :(得分:3)
您不能只发送您关心的部分,您需要发送所有内容。复制Chrome完全生成的POST请求。
请注意,某些POSTed值可能是CSRF令牌。 Base64编码的字符串特别可能(dnf_opt_template
,dnf_opt_template_dir
,dnf_opt_subform_template
和dnf_class_values[procurement_notice][notice_id]
),并且可能应该使用BeautifulSoup从原始页面的HTML中提取。其余的可以硬编码。
否则,您的原始语法是正确的。