我的表格如下:
/usr/src/app/.tmp
所以,基本上表单有两个选项,State和Population,每个都有一些选项..想法是从表单中选择选项然后提交。
在提交时,结果显示在同一页面中。
所以,基本上我如何在python中提交这个帖子请求...然后得到结果(当按下提交时......页面会刷新结果?) 如果这有意义,请告诉我? 感谢
答案 0 :(得分:4)
您要做的是向POST
http://example.com/showtree.jsp
请求
requests
库(推荐)参考:http://docs.python-requests.org/en/master/
requests
库极大地简化了HTTP请求,但是是一个额外的依赖
import requests
# Create a dictionary containing the form elements and their values
data = {"state": "ca", "population": 100}
# POST to the remote endpoint. The Requests library will encode the
# data automatically
r = requests.post("http://example.com/showtree.js", data=data)
# Get the raw body text back
body_data = r.text
urllib
此处的相关答案:Python - make a POST request using Python 3 urllib
from urllib import request, parse
# Create a dictionary containing the form elements and their values
data = {"state": "ca", "population": 100}
# This encodes the data to application/x-www-form-urlencoded format
# then converts it to bytes, needed before using with request.Request
encoded_data = parse.urlencode(data).encode()
# POST to the remote endpoint
req = request.Request("http://example.com/showtree.js", data=encoded_data)
# This will contain the response page
with request.urlopen(req) as resp:
# Reads and decodes the body response data
# Note: You will need to specify the correct response encoding
# if it is not utf-8
body_data = resp.read().decode('utf-8')
根据t.m.adam的评论添加,
以上示例是向大多数URI端点(如API或基本网页)提交POST
请求的简化方法。
然而,有一些常见的并发症:
...或其他隐藏字段
隐藏字段仍会显示在<form>
的源代码中(例如<input type="hidden" name="foo" value="bar">
如果隐藏字段在每个表单加载中保持相同的值,则只需将其包含在标准数据字典中,即
data = {
...
"foo": "bar",
...
}
如果隐藏字段在页面加载之间发生变化,例如一个CSRF令牌,你必须首先加载表单的页面 (例如,带有GET
请求),解析响应以获取表单元素的值,然后将其包含在数据字典中< / p>
......或其他需要Cookie的情况。
您最好的方法是制作系列请求,在正常使用目标网页之前完成所需的步骤(例如,向登录表单提交POST
请求)
您需要使用“饼干罐”。此时我真的开始推荐requests
库;您可以阅读有关cookie处理的更多信息here
有时,表单需要在提交之前运行Javascript。
如果你不幸有这样的表格,不幸的是我建议你不再使用python,并切换到某种无头浏览器,如PhantomJS
(可以使用像Selenium这样的库来控制PhantomJS;但是对于简单的项目,可能更容易直接使用PhantomJS)