8

javascript関数によって入力されるhtmlフォームがあります。すべてのフォーム要素の値を取得する別のJavaScript関数があり、現在はアラートを使用してそれらをユーザーに表示しています。htmlページは、次のコードを使用してPython経由で表示されます。

import webbrowser
new = 2 #open new tab if possible
url = "form.html"
webbrowser.open(url, new=new)

これはすべてうまく機能しますが、アラートを使用してデータを表示する代わりに、データをPythonに戻したいのですが、方法がわかりません。すべてのデータはjavascript配列に格納されているため、基本的にはこの1つのデータを渡すだけで済みます。

編集:外部ライブラリを使用できません。

4

2 に答える 2

9
>>> import json
>>> weird_json = '{"x": 1, "x": 2, "x": 3}'
>>> x = json.loads(weird_json)
>>> x
{u'x': 3}
>>> y = json.loads('["foo", {"bar":["baz", null, 1.0, 2]}]')
>>> y
[u'foo', {u'bar': [u'baz', None, 1.0, 2]}]

HTMLデータを取得して辞書に変換すると、次のことが可能になります。 print x['x']

これが出発点です。ポートをリッスンするソケットをPythonで作成します。次に、データを受信させます。

Javascriptで、ポート(Pythonがリッスンするポート)に接続できるソケットを開きます。たとえば、 http://socket.io/を使用します。

これは純粋なソケット間関連の問題ですか?


PythonとJavascriptの連携関係(ポート80):

from socket import *
import json
s = socket()
s.bind(('', 80))
s.listen(4)
ns, na = s.accept()

while 1:
    try:
        data = ns.recv(8192)
    except:
        ns.close()
        s.close()
        break

    data = json.loads(data)
    print data

そこで、80をリッスンするソケットを取得し、それに接続して、必要なものを送信します。

function callPython()
{
var xmlhttp;
if (window.XMLHttpRequest)
  {// code for IE7+, Firefox, Chrome, Opera, Safari
  xmlhttp=new XMLHttpRequest();
  }
else
  {// code for IE6, IE5
  xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
  }
xmlhttp.onreadystatechange=function()
  {
  if (xmlhttp.readyState==4 && xmlhttp.status==200)
    {
    document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
    }
  }
xmlhttp.open("GET","Form-data",true);
xmlhttp.send();
}

たとえば、フォームデータを文字列として送信できる場合、「Form-data」を置き換えると、Pythonからの応答を「myDiv」に入れることができます:)

于 2013-02-08T17:51:29.723 に答える
2

Ghost.pyのようなものはあなたが望むことをすることができるはずです。

これにより、JavaScriptの評価が可能になります。

result, resources = ghost.evaluate(
    "document.getElementById('my-input').getAttribute('value');")

どちらが役立つはずです。

私はPhantomJSをJSヘッドレスWebkitブラウザーを使用しましたが、これはPythonを使用した移植および/またはリワークです。


私のユースケースでは、依存関係をインストールするのが面倒だったので、からPhantomJSを呼び出しました。subprocess.callGhost

JSonをstdoutそのjson.loads上に発行しました。

于 2013-02-08T18:01:13.480 に答える