使用nokogiri从网站提取信息

时间:2012-11-07 05:58:00

标签: ruby-on-rails ruby nokogiri

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

3 个答案:

答案 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客户端最好使用适合的库。 HTTPartyRest-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)等。即使你不这样做需要做这种事情,我发现这个解决方案更清洁。