将信息从html传递到python

Posted

技术标签:

【中文标题】将信息从html传递到python【英文标题】:Pass information out of html to python 【发布时间】:2014-02-17 23:05:09 【问题描述】:

我对python和html非常陌生,我一直在尝试使用python(使用cgi)运行一个简单的httpserver。从这台服务器我可以运行一个 location.py 文件来显示用户的地理位置。然后我想把这个位置写到我电脑上的一个文本文件中,但我不知道该怎么做。目前我的 location.py 实际上是一个由 py​​thon 加载的 html5 页面,但我不知道如何从我的这个页面中提取所需的信息。

附:这样做的灵感是让我的 iphone 和我的笔记本电脑共享同一个 wifi 网络(adhoc 便携式热点),然后让我的笔记本电脑在谷歌地球中使用我的 iphone 更准确的 gps。这我最终想写入一个 kml 文件,该文件会不断更新我当前的纬度和经度。可能有更简单的方法可以做到这一点,但我认为学习一点 Python 会是个好主意。

我的 location.py 文件

#!/python

print( "Content-type: text/html\n\n")
print( """\
<html>
<head>

<p id="demo">Test:</p>
<script>
var x=document.getElementById("demo");
function getLocation()
  
  if (navigator.geolocation)
    
    navigator.geolocation.getCurrentPosition(showPosition);
    
  elsex.innerHTML="Geolocation is not supported by this browser.";
  
function showPosition(position)
  
  x.innerHTML="Latitude: " + position.coords.latitude + 
  "<br>Longitude: " + position.coords.longitude;
  
  window.onload = getLocation;
</script>
</head>
<body>
</body>
</html>""")

还有我的服务器文件(webserver.py)

import http.server

def main():

    server_address = ("", 8000)
    handler = http.server.CGIHTTPRequestHandler
    handler.cgi_directories = ['/python']
    server = http.server.HTTPServer(server_address, handler)
    try:
        server.serve_forever()
    except KeyboardInterrupt:
        server.socket.close()

if __name__ == '__main__':
    main()

【问题讨论】:

【参考方案1】:

您需要将请求发送回您的服务器并提供该位置,然后在您的脚本中使用cgi.FielStorage 来获取数据。要发送请求,您必须稍微修改一下您的 javascipt 代码。

我向您展示了一个发送静态数据的示例(因为我的 PC 上没有地理位置:P),您需要更改它以发送正确的 lat,lon 数据(可能在函数内部showPosition?)

接下来,更改您的 python 脚本(请检查 javascript 上是否也有更改!):

#!/usr/bin/env python

import cgi

form = cgi.FieldStorage()

lat = form.getvalue('lat')
lon = form.getvalue('lon')

with open('location.txt','wt') as f:
    if lat:
        f.write(lat)
    f.write("\n")
    if lon:
        f.write(lon)

f.close()

print( "Content-type: text/html\n\n")
print( """\
<html>
<head>

<p id="demo">Test:</p>
<script>
var x=document.getElementById("demo");
function getLocation()
  
  //this is to send the location back to your python script
  var req = new XMLHttpRequest();
  req.open('GET', 'location.py?lat=1&lon=2', false);
  req.send(null);    
  //----------------------------------------------    

  if (navigator.geolocation)
    
    navigator.geolocation.getCurrentPosition(showPosition);
    
  elsex.innerHTML="Geolocation is not supported by this browser.";
  
function showPosition(position)
  
  x.innerHTML="Latitude: " + position.coords.latitude + 
  "<br>Longitude: " + position.coords.longitude;
  
  window.onload = getLocation;
</script>
</head>
<body>
</body>
</html>""") 

如果您运行代码,您会在文件 location.txt 上看到您有坐标。

当然,您可以将进程拆分为两个脚本(几乎可以肯定是正确的方法!)并将请求发送到您的第二个脚本(save_location.py 或许?)。

【讨论】:

这完全解决了它。我将多余的 javascript 移到了 showposition 函数中,并将数字替换为“+ position.coords.latitude+”。它像梦一样工作。如果您不介意,您会解释一下有关拥有两个脚本的更多信息。我尝试(可能非常天真)只是将新的 python 放在第二个脚本中,并在我运行第一个脚本时运行它,但这似乎不起作用。另外,我想您正在考虑一个清洁器,而不是每次都必须手动运行保存脚本!我需要在我的其他脚本中引用我的保存脚本吗? 您可以将所有保存部分移动到一个名为(例如)save_location.py 的脚本并放入 cgi 目录,然后在您从 javascrit 调用时,您需要将req.open('GET', 'location.py?...); 更改为req.open('GET', 'save_location.py?...);。您应该记住,此调用是使用 AJAX 执行的,因此它是异步的,至少在您使用它时您不会看到任何输出。我建议你检查这个w3schools.com/ajax/ajax_intro.asp 或webmonkey.com/2010/02/ajax_for_beginners 来学习 AJAX,最好的问候

以上是关于将信息从html传递到python的主要内容,如果未能解决你的问题,请参考以下文章

如何将信息从 node.js 传递到 html

如何使用 QWebChannel 将信息从 JS 传递到 Python

pythonpython操作剪切板-pyperclip模块

PythonPython库之Web信息提取

PythonPython库之Web信息提取

MVC - 从 Jquery 传递到查看信息