pythonの処理結果をJavascriptに渡したい
最近、Pythonでスクレイピングをやっています。
スクレイピングはやはりPython最強という感じなのですが、結果をブラウザで見やすく表示したいと思うと、今度はJavascriptを使いたくなります。
そんなわけでPythonからJavascript(node.js)にJSONを渡す方法を調べました。
流れとしては
Python => (Javascript & Pug) => HTMLファイル
という感じです。
Pythonで変数をJSON化してprint
ごく簡単なサンプルでやり方だけを残しておきます。
Pythonではjson.dumpsを使って変数をJSONに変換します。
それをprintで画面に書き出します。
JSONに変換せずに直接printした場合は、Javascript側でエラーになってしまいました。
import json
data={"name":"hoge","value":135}
data_json=json.dumps(data)
print(data_json)
Python変数の型によってはjson.dumpsでエラーがでるみたいです。
その場合には変換フィルタを実装する必要があるそうです。
また、日本語が文字化けする場合にはjson.dumpsにensure_ascii=False
というオプションを付けたら直りました。
data_json=json.dumps(data,ensure_ascii=False)
あと、見やすいようにインデントを付けたければindent=2
などと指定します。
data_json=json.dumps(data,indent=2)
ファイルに書き込むときはjson.dump
ちなみにファイルに保存したい場合には以下のように書きます。
with open('test.json', 'w') as f:
json.dump(data, f, indent=2)
Javascriptはfsで標準入力を読み込む
Pythonの出力をパイプでJavascriptに渡します。
受ける側のJavascriptでは、fs.readFileSync
のパスを"/dev/stdin"
(標準入力)にします。
ファイルを読むときは普通にファイルパスを書きます。
あとはJSON.parseしてPugに渡します。
表示したいjsonデータに合わせてtemplate.pugを作っておきます。
とりあえず出力にはfsを使わずシェルのリダイレクトを使います。
const fs = require('fs');
let text = fs.readFileSync("/dev/stdin", "utf-8");
const json = JSON.parse(text);
const pug = require('pug');
const options = { pretty: true, data: json };
console.log(pug.renderFile('template.pug', options));
パイプで繋いでリダイレクトでファイルに出力
最終的には以下のようにパイプとリダイレクトでHTMLファイルを作成します。
result.htmlをブラウザで開いて閲覧します。
python script.py | node script.js > result.html
シェルスクリプトを組めばブラウザで開くところまで自動化できますね。