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

10
我是一个大型GUI应用程序的开发人员,我们有一个用于缺陷跟踪的网站。任何人都可以向缺陷跟踪站提交新的缺陷。我们可以从我们的桌面应用程序中检测到某些故障(即未处理的异常),在这种情况下,我们希望在用户预定义的浏览器中打开提交新错误表单,向一些表单字段添加我们可以收集到的有关故障的任何信息。我们可以使用GET或POST http方法检索提交新错误表单,并且我们可以为该表单提供默认字段值。因此,从http服务器端来看,一切都相当顺利。
到目前为止,我们可以使用 Python 标准库中的 webbrowser 模块 成功打开 URL 并将默认值作为 GET 参数传递给 URL。然而,这种方法存在一些 限制,例如某些浏览器(特别是 MS IE)允许的 URL 最大长度。 webbrowser 模块似乎没有以 POST 方式请求 URL 的方法。另一方面,有 urllib2 模块 提供了我们想要的控制类型,但据我所知,它缺少在用户首选浏览器中打开检索到的页面的可能性。

是否有一种方法可以获得我们想要的混合行为(即具有 urllib2 的精细控制和 webbrowser 的高级功能)?

附注:我们考虑过使用 urllib2 检索URL,将其内容保存到临时文件中,然后使用 webbrowser 打开该文件。这是一种不太好的解决方案,在这种情况下,我们还必须处理其他问题,如相对URL。是否有更好的解决方案?


如果我们有一个HTML文件,是否有可能使用Python创建一个网站并显示HTML数据? - Ravi
4个回答

9

这不是正确的答案,但它也能够工作。

import requests
import webbrowser

url = "https://www.facebook.com/login/device-based/regular/login/?login_attempt=1&lwv=110"
myInput = {'email':'mymail@gmail.com','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参数在浏览器中打开页面,并显示已保存的部分填写表单。

看起来很有前途,但不幸的是我们不能更改服务器端代码。除非有非常强的理由。 - Sergio

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 

如果服务器可以轻松修改,则更好的方法是使用urllib2进行部分参数的POST请求,并使用由服务器生成的URL打开webbrowser,如@Acorn建议的那样

1
命令“webbrowser.open_new_tab(f.name)”在Mac OS中无法工作。您还需要包括协议:webbrowser.open_new_tab('file://' + f.name)。 - Paulo Cheque
您可能还想将tempfile.NamedTemporaryFile()更改为tempfile.NamedTemporaryFile(delete=False)。 - Paulo Cheque
@PauloCheque:[webbrowser](http://hg.python.org/cpython/file/3.3/Lib/webbrowser.py#l585)会自动将本地URL添加`file:`。 - jfs
@PauloCheque:delete=True 启用自动清理。请注意:我使用 f.flush()(使数据对操作系统可用)而不是 f.close()(关闭并删除文件)。 - jfs

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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接