0

我试图弄清楚如何使用 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
4

3 回答 3

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
于 2012-11-07T06:29:45.070 回答
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
于 2012-11-07T06:28:51.947 回答
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)等的初始化程序。即使您不需要这样做当然,我发现这个解决方案更清洁。

于 2012-11-07T13:41:03.363 回答