gpt4 book ai didi

python - 如何使用 post 请求填写表单并获得响应

转载 作者:太空宇宙 更新时间:2023-11-04 09:49:54 25 4
gpt4 key购买 nike

我有如下表格:

url = "http:/foo.com"
<table>
<form action="showtree.jsp" method="post" id="form" name="form">
<input type="hidden" id="sortAction" name="sortAction" value="">
<tr>
<td style="text-align: right;font-weight:bold;">State:&thinsp;</td>
<td><select name="state">
<option value="ca">CA</option>
<option value="or">OR</option>
<option value="al">AL</option>

</select></td>
</tr>
<tr>
<td style="text-align: right;font-weight:bold;">Populartion:&thinsp;</td>
<td><select id="pop" name="population" onchange="disableShowOnAll()">
<option value="100">100</option>
<option value="200">200</option>
<option value="300">300</option>


</select></td>
</tr>
<tr>
<td></td>
<td>
<button id="showbutton" class="btn btn-default" onclick="submitForm('show')">Show Tree
</button>
</td>
</tr>
</form>

所以,基本上表单有两个选项,State 和 Population,每个选项都有一些选项。我们的想法是从表单中选择选项,然后提交。

提交后,结果显示在同一页面中..

那么,基本上我是如何在 python 中提交这个发布请求的……然后得到结果(当提交被按下时……页面刷新了结果?)让我知道这是否有意义?谢谢

最佳答案

您要做的是提交 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 的评论添加

以上示例是提交 POST 的简化方式请求大多数 URI 端点,例如 API 或基本网页。

但是,有一些常见的并发症:

1)有CSRF token

...或其他隐藏字段

隐藏字段仍将显示在 <form> 的源代码中(例如 <input type="hidden" name="foo" value="bar">

如果隐藏字段在每次加载表单时都保持相同的值,则只需将其包含在标准数据字典中即可,即

data = {
...
"foo": "bar",
...
}

如果隐藏字段在页面加载之间发生变化,例如一个 CSRF token ,您必须首先加载表单页面(例如使用 GET 请求),解析响应以获取表单元素的值,然后将其包含在您的数据字典中

2) 该页面需要您登录

...或其他一些需要 cookie 的情况。

您最好的方法是发出一系列请求,在正常使用目标页面之前完成所需的步骤(例如,向登录表单提交 POST 请求)

您将需要使用“cookie jar”。在这一点上,我真的开始推荐 requests图书馆;您可以阅读有关 cookie 处理的更多信息 here

3) 需要在目标表单上运行Javascript

有时,表单需要在提交之前运行 Javascript。

如果你不幸拥有这样的表单,不幸的是我建议你不再使用python,并切换到某种 headless 浏览器,比如PhantomJS

(可以使用像 Selenium 这样的库从 Python 控制 PhantomJS;但对于简单的项目,直接使用 PhantomJS 可能更容易)

关于python - 如何使用 post 请求填写表单并获得响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48199019/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com