2014-02-11 39 views
0

我使用请求来访问此webpage,随后使用Beautiful Soup分析和检查HTML。如何使用Python请求发送表单数据

此页面允许用户指定过去应返回结果的天数。

Days selection

当我提交在浏览器的请求与我选择的365天,检查的反应,我觉得这种形式的数据与请求一起发送:这是通过页面上的表单完成

Request Form Data

值得注意的是,表格数据为 “dnf_class_values [procurement_notice] [_ posted_date]:365”,因为这是我的选择365天所对应的唯一元素。

当这个请求的浏览器返回时,我得到ñ结果,其中ñ是最大可能的值给出,这是最大的时间段可能。 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'}) 

这是返回相同数量的结果,当形式与天数的默认值提交的。

我试着在URL编码data的关键,以及使用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

如果你想实际做这种浏览器交互,'requests'不是你想要使用的工具。看看“CasperJS”或“Selenium” –

回答

3

你不能只发送你关心的部分,你需要发送的一切。复制Chrome制作的POST请求。

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

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

相关问题