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

提供されたリンクのデータはXML ではなくJSON形式であるため、ノコギリは適切ではありません。

必要なデータを取得するには、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

API クライアントの作成は、それに適したライブラリを使用して行うのが最適です。HTTPartyこれにRest-clientは良い宝石です。応答タイプを検出して解析できます。さらに、サービスをモデル化するクラスを作成できるため、コードは整然とした DRY のままになります。

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

text/html注: 通常、HTTParty はヘッダーからタイプを自動的に判別しますが、このサイトは、コンテンツがいつあるべきかというヘッダーを送信していますapplication/json。したがって、行を追加する必要がありますformat :json

良い点は、所有するクラスに詳細がうまく隠されていることです。それを拡張できます: 別のキーを持つ他のユーザーが使用できるようにしたいとしましょう。キーなどを渡すことができるイニシャライザを作成するだけですelophant = Elophant.new(key)。このタイプを実行する必要がない場合でもこのソリューションはよりクリーンであることがわかりました。

于 2012-11-07T13:41:03.363 に答える
1

出力はhtmlではなくjsonです。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 に答える