【问题标题】:How to insert data in json after crawling through casperjs?通过casperjs爬取后如何在json中插入数据?
【发布时间】:2015-09-02 18:14:20
【问题描述】:

我编写的代码可以解析一些网页中的大量单词(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
...

所以我想将此数据插入到我的json文件的“word”部分(下面的json示例代码)

并自动添加其他列("type": "fruit" and "spell":)

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

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

感谢您添加更多答案!.. 但我不知道我应该把这些代码放在哪里

您能否再告诉我一次...您给我的哪个代码执行“将结果保存到 JSON 文件?”因为我必须像这样在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"]

【问题讨论】:

  • 生成typespell 属性的规则是什么?
  • 其实我会像这样解析数据.. 1. 搜索“fruit” 2. 获取网页的 innerhtml 结果。所以在“type”的情况下,我想我必须直接写“fruit”然后进行迭代,“spell”是“word”的第一个和第二个拼写!

标签: javascript ruby-on-rails json casperjs


【解决方案1】:

那么,是这样的吗?

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");

我希望这会有所帮助。

【讨论】:

  • 感谢您的回答:)
【解决方案2】:

通过 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

【讨论】:

  • 对不起,我对 js 和编程很陌生。我很难理解...你的意思是我不必在 js 文件中添加任何 function() 代码?(在 casperjs 代码中)
  • @HyungKyuPark:当然。我以为这只是关于 JSON 的。附加了创建对象的函数(另一个答案看起来也不错)
  • 感谢您更详细的回答!但我无法抓住重点,因为我不擅长英语或……所以请你再读一遍我的问题的最后一部分并回答我吗?我加了几行!
  • 还是说我必须在json文件中需要js文件??
  • 我明白了,非常感谢用户-------我意识到当我必须附加内容时 fs.write('.json', result, 'a'); !
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-14
  • 2021-11-08
  • 1970-01-01
  • 2010-10-28
  • 2013-06-13
  • 2020-12-03
  • 1970-01-01
相关资源
最近更新 更多