如何在浏览casperjs后在json中插入数据?

时间:2015-09-02 18:14:21

标签: javascript ruby-on-rails json casperjs

我编写的代码可以从一些网页中解析很多单词(innerHTML)。

我想直接将数据插入json文件..

这是我的js代码......

var words = [];
var casper = require('casper').create();

    function getWords() {
        var words = document.querySelectorAll('td.subject a');
        return Array.prototype.map.call(words, function(e) {
            return e.innerHTML;
        });
    }


        casper.start('http://www.todayhumor.co.kr/board/list.php?table=bestofbest', function() {                
            words = this.evaluate(getWords);
        });

        for (var i=2; i <=5; i++) {
        casper.thenOpen('http://www.todayhumor.co.kr/board/list.php?table=bestofbest&page='+i, function() {              

            words = words.concat(this.evaluate(getWords));
        });
        }

    casper.run(function() {
        // echo results in some pretty fashion
        this.echo(words.length + ' links found:').exit();
        this.echo(words.join('\n')).exit();
});

我通过这样的终端运行这段代码!

username@wow:~/workspace/app/assets/javascripts $ casperjs application.js

,结果是(例如)

150 words found:
apple
banana
melon
kiwi
citrus
watermelon
passionfruit
mango
orange
...

所以我想在&#34; word&#34;中插入这些数据我的json文件的部分(以下json的示例代码)

并自动添加其他列(&#34;键入&#34;:&#34;水果&#34;和&#34;拼写&#34; :)

{ "my_initial_words": [
    {
    "type": "fruit",
    "word": "apple",
    "spell": "ap"
    },
    {
    "type": "fruit",
    "word": "banana",
    "spell": "ba"
    },
    {
    "type": "fruit",
    "word": "melon",
    "spell": "me"
    }   

]
}
----------------------------------------------------------------------------

感谢您添加更多答案! 但我无法抓住我应该把这些代码放在哪里

你能再一次告诉我......你给我的代码执行了什么&#34;将结果保存到JSON文件?&#34;因为我必须在我的seeds.rb文件中读取json文件(makeyourap.json)

require 'json'
file = File.open(Rails.root.join('db','makeyourap.json'))
contents = file.read
json = ActiveSupport::JSON.decode(contents)["my_initial_words"]

2 个答案:

答案 0 :(得分:2)

那么,这样的事情呢?

function makeTypeObject(name, type) {
  return {
    name: name,
    type: type,
    spell: name.substr(0,2)
  };
}

var wordDesc = words.map(function (word) { 
   return makeTypeObject(word, "fruit"); 
});

var finalObject = {
  my_initial_words: wordDesc
};

var jsonString = JSON.stringify(finalObject);
// if you want prettyprint, try JSON.stringify(finalObject, null, "\t");

我希望这会有所帮助。

答案 1 :(得分:1)

通过casper

写入文件

如果您想要一个可以读写的文件,附加内容,您可以这样做:

var fs = require('fs');
var FILENAME = 'makeyourap.json';
function add_new_fruits(fruits) {
    var data;
    if ( fs.isFile(FILENAME) ) {
        data = fs.read(FILENAME);
    } else {
        data = JSON.stringify({'my_initial_words' : [] });
    }
    var json = JSON.parse(data);
    fruits.forEach(function(word) {
        json.my_initial_words.push({"type": "fruit",
                                    "name": word,
                                    "spell": word.slice(0,2)});
    });
    data = JSON.stringify(json, null, '\t');
    fs.write(FILENAME, data, "w");
}

使用此代替较旧的this.echo。只需将其称为

casperjs application.js

这可以从文件中读取对象,也可以在文件不存在时创建。然后,它从新的水果(包括重复项)中追加每个新对象,并将其写回FILENAME

以前的方法:如何推出自己的

创建对象

首先,您要创建一个只有参数my_initial_words的对象,其值如上所述。

您可以通过

创建一个功能
function createFinal(wordArray) {
    var out = [];
    wordArray.forEach(function(word) {
        out.push({"type": "fruit", "name": word, "spell": word.slice(0,2)});
    });
    return out;
}

创建数组。然后,通过

创建对象
var my_object = { "my_initial_words": createFinal(words) };

到JSON

Javascript有built-in JSON-object。使用像

这样的javascript对象
var my_object = { "my_initial_words": ...

如上所述,使用

JSON.stringify(my_object) 

获取要写的JSON表示。

较旧:通过重定向写入文件

之前,你有

this.echo(words.join('\n')).exit();

给了你基本的清单。使用this.echo,尝试将其替换为

var my_object = { "my_initial_words": createFinal(words) };
this.echo(JSON.stringify(my_object)).exit();

打印到标准输出。只需删除其他this.echo行(找到150个字)并通过

重定向输出
casperjs application.js > makeyourap.json

如果您想在casperjs中写入文件,请查看write-results-into-a-file-using-casperjs