无法在Ruby

时间:2016-02-19 21:51:41

标签: ruby json reddit

我正在尝试刮掉reddit(无API),我遇到了一堵砖墙。在reddit上,每个页面都有一个JSON表示,只需将.json附加到末尾就可以看到,例如https://www.reddit.com/r/AskReddit.json

我安装了NeatJS,并编写了一小段代码来清理JSON并打印出来:

require "rubygems"
require "json"
require "net/http"
require "uri"
require 'open-uri'
require 'neatjson'

url = ("https://www.reddit.com/r/AskReddit.json")

result = JSON.parse(open(url).read)

neatJS = JSON.neat_generate(result, wrap: 40, short: true, sorted: true, aligned: true, aroundColonN: 1)

puts neatJS

它运作良好:

Screenshot (还有更多的东西,它继续几页,完整的JSON在这里:http://pastebin.com/HDzFXqyU

然而,当我改变它以仅提取我想要的值时:

url = ("https://www.reddit.com/r/AskReddit.json")

result = JSON.parse(open(url).read)

neatJS = JSON.neat_generate(result, wrap: 40, short: true, sorted: true, aligned: true, aroundColonN: 1)

neatJS.each do |data|
  puts data["title"]
  puts data["url"]
  puts data["id"]
end

它给了我一个错误:

  002----extractallaskredditthreads.rb:17:in `<main>': undefined method `each' for #<String:0x0055f948da9ae8> (NoMethodError)

我一直在尝试提取器的不同变体大约两天,但没有一个有效。我觉得我错过了一些非常明显的东西。如果有人能够指出我做错了什么,那将不胜感激。

修改

事实证明我的变量名称错误了:

 neatSJ =/= neatJS

然而,纠正这个只会改变我得到的错误:

 002----extractallaskredditthreads.rb:17:in `<main>': undefined method `each' for #<String:0x0055f948da9ae8> (NoMethodError)

正如我所说,我一直在尝试多种提取标签的方法,这可能会导致我的错字。

2 个答案:

答案 0 :(得分:2)

在此代码中:

result = JSON.parse(open(url).read)

neatJS = JSON.neat_generate(result, wrap: 40, short: true, sorted: true, aligned: true, aroundColonN: 1)

... result是一个Ruby Hash对象,是使用JSON.parse将JSON解析为Ruby对象的结果。同时,neatJS是一个字符串,是在JSON.neat_generate哈希上调用result的结果。在字符串上调用each没有意义。如果要访问JSON结构中的值,则需要使用result对象,而不是neatJS字符串:

children = result["data"]["children"]

children.each do |child|
  puts child["data"]["title"]
  puts child["data"]["url"]
  puts child["data"]["id"]
end

答案 1 :(得分:0)

这是一个错字吗?

neatJS = JSON.neat_generate
[...]
neatSJ.each do |data|