Python:通过 POST 请求 URL 并在浏览器中显示结果

问题描述 投票:0回答:4

我是一个大型 GUI 应用程序的开发人员,我们有一个用于错误跟踪的网站。任何人都可以向错误跟踪站点提交新错误。我们可以从桌面应用程序中检测到某些故障(即未处理的异常),在这种情况下,我们希望在用户预定义的浏览器中打开提交新错误表单,将我们可以收集到的有关故障的任何信息添加到某种表单中领域。我们可以使用 GET 或 POST http 方法检索提交新错误表单,并且可以为该表单提供默认字段值。所以从 http 服务器端来看一切都很好。

到目前为止,我们可以使用 Python 标准库中的

webbrowser
模块成功打开一个 URL,并在 URL 中传递默认值作为 GET 参数。但是,此方法存在一些限制,例如某些浏览器(特别是 MS IE)允许的 URL 最大长度。
webbrowser
模块似乎没有办法使用 POST 请求 URL。 OTOH 有
urllib2
模块
提供了我们想要的控件类型,但据我所知,它无法在用户首选浏览器中打开检索到的页面。

有没有办法获得我们想要的这种混合行为(通过

urllib2
的高级功能来精细控制
webbrowser
)?

PS:我们考虑过使用

urllib2
检索 URL、将其内容保存到临时文件并使用
webbrowser
打开该文件的可能性。这是一个有点令人讨厌的解决方案,在这种情况下,我们将不得不处理其他问题,例如相对 URL。有更好的解决办法吗?

python http urllib2 python-webbrowser
4个回答
9
投票

这不是正确的答案。但它也有效

import requests
import webbrowser

url = "https://www.facebook.com/login/device-based/regular/login/?login_attempt=1&lwv=110"
myInput = {'email':'[email protected]','pass':'mypaass'}
x = requests.post(url, data = myInput)
y = x.text
f = open("home.html", "a")
f.write(y)
f.close()
webbrowser.open('file:///root/python/home.html')

6
投票

我不知道有什么方法可以在网络浏览器中打开 POST 请求的结果,而无需将结果保存到文件并打开该文件。

采取替代方法并将数据临时存储在服务器上怎么样?然后可以使用简单的 id 参数在浏览器中打开页面,并显示保存的部分填写的表单。


2
投票

您可以使用

tempfile.NamedTemporaryFile()

import tempfile
import webbrowser
import jinja2

t = jinja2.Template('hello {{ name }}!') # you could load template from a file
f = tempfile.NamedTemporaryFile() # deleted when goes out of scope (closed)
f.write(t.render(name='abc'))
f.flush()
webbrowser.open_new_tab(f.name) # returns immediately 

如果服务器可以轻松修改,更好的方法是使用

POST
发出带有部分参数的
urllib2
请求,并使用
webbrowser
打开服务器生成的 url,如@Acorn建议的


0
投票

如果使用

selenium
,可以注入脚本来写入从响应生成的 HTML 页面,而不是写入文件:

response = requests.post('https://xxx', data = ...)
response_html = response.text 
driver.get("about:blank")
driver.execute_script("document.write(arguments[0])", response_html)
© www.soinside.com 2019 - 2024. All rights reserved.