我正试图弄清楚如何使用nokogiri提取文件中的信息。
生成的信息不是xml或html文件..所以不确定如何获取此信息!
def get_summoner_account
url = "http://elophant.com/api/v1/euw/getSummonerByName?summonerName=Heggom&key=0r57xO0H2A7ukQi6gUbG "
doc = Nokogiri::HTML(open(url))
name = doc.xpath("name").collect(&:text)
acctID = doc.xpath("acctID").collect(&:text)
summonerId = doc.xpath("summonerId").collect(&:text)
puts accID
puts name
puts summonerID
end
答案 0 :(得分:2)
您提供的链接数据为JSON格式,而不是XML格式,因此Nokogiri不合适。
要获取所需的数据,您可以使用Ruby的Net::HTTP来获取数据,使用JSON来解析它:
require 'net/http'
require 'uri'
require 'json'
def get_summoner_account
uri = URI("http://elophant.com/api/v1/euw/getSummonerByName?summonerName=Heggom&key=0r57xO0H2A7ukQi6gUbG")
resp = Net::HTTP.get_response(uri)
hash = JSON(resp.body)
name = hash['name']
acctId = hash['acctId']
summonerId = hash['summonerId']
...
end
答案 1 :(得分:1)
输出是json,而不是html。您可以使用Ruby标准库来提取它。
require 'json'
require 'open-uri'
page = open('http://elophant.com/api/v1/euw/getSummonerByName?summonerName=Heggom&key=0r57xO0H2A7ukQi6gUbG')
contents = page.read
h = JSON.parse(contents)
puts a['acctId']
=> 22031699
puts h['name']
=> "Heggom"
puts h['summonerId']
=> 19335440
答案 2 :(得分:1)
编写API客户端最好使用适合的库。 HTTParty
和Rest-client
对此非常有用。他们可以检测响应类型并为您解析它。此外,它们允许您创建为服务建模的类,因此您的代码保持整洁和干燥。
以下是使用HTTParty重写的示例。
class Elophant
include HTTParty
base_uri "http://elophant.com/api/v1/"
format :json
@key = "0r57xO0H2A7ukQi6gUbG"
def self.get_summoner(name)
get('/euw/getSummonerByName', :query => {'summonerName' => name, 'key' => @key})
end
end
然后使用非常简单:
summoner = Elophant.get_summoner("Heggom")
puts summoner['acctId'] #=> 22031699
puts summoner['name'] #=> "Heggom"
puts summoner['summonerId'] #=> 19335440
注意:通常HTTParty会自动从标头中确定类型,但此网站会发送一个标题,说明内容为text/html
时应为application/json
。因此,我们需要添加第format :json
行。
好的一点是,细节很好地隐藏在你拥有的课堂中。你可以扩展它:假设你想让别人使用不同的密钥,你可以创建一个初始化程序,允许你传入密钥elophant = Elophant.new(key)
等。即使你不这样做需要做这种事情,我发现这个解决方案更清洁。