【问题标题】:How to Send Form Data with Python Requests如何使用 Python 请求发送表单数据
【发布时间】:2014-02-11 02:20:35
【问题描述】:

我正在使用请求来访问此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

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

【问题讨论】:

  • 如果你想实际做这种浏览器交互,requests不是你想用的工具。查看CasperJSSelenium

标签: python beautifulsoup httprequest python-requests


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-11
    • 1970-01-01
    • 1970-01-01
    • 2011-10-03
    • 2020-06-05
    相关资源
    最近更新 更多