我正在尝试刮掉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
它运作良好:
(还有更多的东西,它继续几页,完整的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)
正如我所说,我一直在尝试多种提取标签的方法,这可能会导致我的错字。
答案 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|