如何使用Python请求发送表单数据

时间:2014-02-11 02:20:35

标签: python beautifulsoup httprequest python-requests

我正在使用请求来访问此webpage,然后使用Beautiful Soup解析和检查HTML。

此页面允许用户指定过去应返回结果的天数。这是通过页面上的表单完成的:

Days selection

当我在浏览器中提交请求并选择365天并检查响应时,我发现此表单数据随请求一起发送:

Request Form Data

值得注意的是表格基准“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

该请求的适当语法是什么?

1 个答案:

答案 0 :(得分:3)

您不能只发送您关心的部分,您需要发送所有内容。复制Chrome完全生成的POST请求。

请注意,某些POSTed值可能是CSRF令牌。 Base64编码的字符串特别可能(dnf_opt_templatednf_opt_template_dirdnf_opt_subform_templatednf_class_values[procurement_notice][notice_id]),并且可能应该使用BeautifulSoup从原始页面的HTML中提取。其余的可以硬编码。

否则,您的原始语法是正确的。