【问题标题】:passing a python object into a casperjs script iterating over the object and returning a result object to python将 python 对象传递给 casperjs 脚本,遍历该对象并将结果对象返回给 python
【发布时间】:2014-05-23 10:51:04
【问题描述】:

我不熟悉使用更适合网络的语言进行编程,但我已经在 vba 中为 excel 进行了编程。

我想做的是:

  1. 将列表(在 python 中)传递给 casper.js 脚本。
  2. 在 casperjs 脚本中,我想遍历 python 对象(搜索词列表)
  3. 在 casper 脚本中,我想在 google 中查询搜索词
  4. 一旦查询,我想将这些查询的结果存储在一个数组中,我在迭代 python 对象时将它们连接在一起。
  5. 然后,在我搜索完所有搜索项并找到结果后,我想将 RESULTS 数组返回给 python,以便进一步操作数据。

问题 --> 我不知道如何编写 python 函数来将对象传递给 casper。

问题 --> 我也不确定如何编写 casper 函数以将 javascript 对象传递回 python。

这是我的python代码。

import os
import subprocess
scriptType = 'casperScript.js'
APP_ROOT = os.path.dirname(os.path.realpath(__file__))
PHANTOM = '\casperjs\bin\casperjs'
SCRIPT = os.path.join(APP_ROOT, test.js)
params = [PHANTOM, SCRIPT]
subprocess.check_output(params)

js 代码

var casper = require('casper').create();
casper.start('http://google.com/', function() {
this.echo(this.getTitle());
});
casper.run();

【问题讨论】:

  • 您希望我帮助您解决来自here 的问题,但仍未回复。它有帮助吗?有什么问题?

标签: python function loops call casperjs


【解决方案1】:

能否使用 JSON 将数据发送到脚本,然后在取回时对其进行解码?

Python:

json = json.dumps(stuff) //把对象转成字符串传给js

将json文件加载到python中:

with open(location + '/module_status.json') as data_file:
    data = json.load(data_file);

Deserialize a json string to an object in python

Javascript:

arr = JSON.parse(json) //将json字符串转成js数组 json = JSON.stringify(arr) //将数组转成json字符串准备发送给python

【讨论】:

  • STUFF 是我拥有的带有搜索词的列表对象吗?一旦你将东西传递给 json 对象 JSON,然后创建一个 Javascript 数组对象,你如何将数组对象传递给 casperJS 脚本?在 ecvel vba 中它会是 sub CasperScript(SomeParameter) 然后 for i in SomeParameter.length ....(在这里做 javascript 的东西)
  • Stuff 是您的列表/对象,是的。你能用命令 args 调用你的 casperjs 脚本吗?
  • 目前我只是进入 power shell 并输入 casperjs python script name.py 我不知道如何在传递参数时调用 python 脚本,我不知道如何传递参数像搜索字符串或列表到 casperjs 脚本。我是新来的。对不起
  • 您可以使用 python 从文件中加载 json(我将此添加到我的答案中)。您可以将其作为参数传递给您的 js 脚本并使用 CLI docs.casperjs.org/en/latest/cli.html 捕获它
  • @yoshiserry 基本上你可以做的是将python中的列表/对象序列化为JSON并将JSON写入文件。然后从 python 调用您的 casperjs 脚本,该脚本读取此文件(可以硬编码并使用 fs 模块),解析 JSON,执行某些操作,将结果字符串化,将结果写入已知文件。 python 脚本通过读取结果文件、从 JSON 中解析并执行其他操作来继续执行。
【解决方案2】:

您可以使用两个临时文件,一个用于输入,另一个用于 casperjs 脚本的输出。 woverton's answer 可以,但缺少一点细节。最好将 JSON 显式转储到文件中,而不是尝试解析来自 casperjs 的控制台消息,因为它们可以与调试字符串等交错。

在python中:

import tempfile
import json
import os
import subprocess

APP_ROOT = os.path.dirname(os.path.realpath(__file__))
PHANTOM = '\casperjs\bin\casperjs'
SCRIPT = os.path.join(APP_ROOT, test.js)

input = tempfile.NamedTemporaryFile(mode="w", delete=False)
output = tempfile.NamedTemporaryFile(mode="r", delete=False)

yourObj = {"someKey": "someData"}
yourJSON = json.dumps(yourObj)
input.file.write(yourJSON)
# you need to close the temporary input and output file because casperjs does operations on them
input.file.close()
input = None
output.file.close()

print "yourJSON", yourJSON

# pass only file names
params = [PHANTOM, SCRIPT, input.name, output.name]
subprocess.check_output(params)

# you need to open the temporary output file again
output = open(output.name, "r")
yourReturnedJSON = json.load(output)
print "returned", yourReturnedJSON
output.close()
output = None

最后,当对象被垃圾回收时,临时文件将被自动删除。

在 casperjs 中:

var casper = require('casper').create();
var fs = require("fs");

var input = casper.cli.raw.get(0);
var output = casper.cli.raw.get(1);
input = JSON.parse(fs.read(input));
input.casper = "done"; // add another property
input = JSON.stringify(input);
fs.write(output, input, "w"); // input written to output
casper.exit();

casperjs 脚本没有做任何有用的事情。它只是将输入文件写入带有附加属性的输出文件。

【讨论】:

    猜你喜欢
    • 2014-06-06
    • 2018-11-09
    • 1970-01-01
    • 1970-01-01
    • 2018-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-17
    相关资源
    最近更新 更多