Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 我试图返回一个哈希数组,但只有最后一个哈希被添加到数组中?_Ruby_Nokogiri - Fatal编程技术网

Ruby 我试图返回一个哈希数组,但只有最后一个哈希被添加到数组中?

Ruby 我试图返回一个哈希数组,但只有最后一个哈希被添加到数组中?,ruby,nokogiri,Ruby,Nokogiri,这是我得到所有人手的方法 def get_all_hands doc = Nokogiri::HTML(open('http://www.cardplayer.com/rules-of-poker/hand-rankings')) hand_hash = {} hands_array = [] doc.css('div#rules-of-poker-accordion').each do |hands| hands.css('strong').each do |hand|

这是我得到所有人手的方法

def get_all_hands
  doc = Nokogiri::HTML(open('http://www.cardplayer.com/rules-of-poker/hand-rankings'))
  hand_hash = {}
  hands_array = []
  doc.css('div#rules-of-poker-accordion').each do |hands|
    hands.css('strong').each do |hand|
      hand_hash[:name] = hand.text
    end
    hands.css('div.rules-cards').each do |hand|
      hand_value = []
      hand.css('img').each do |card|
        hand_value << card.attr('src')
        hand_hash[:value] = hand_value
      end
    end
    hands_array << hand_hash
  end
  hands_array
end
HandScraper.new.get_all_hands
这是第十手,也是最后一手,当我想要它返回全部10

调用
doc.css('div#扑克手风琴规则')
返回一个div,因为这就是页面的结构。因此,实际上每个循环只输入一次

该站点的布局有点滑稽,因此您必须分别获取名称和值。这是一个暴力解决方案

def get_all_hands
  doc = Nokogiri::HTML(open('http://www.cardplayer.com/rules-of-poker/hand-rankings'))
  hands_array = []

  doc.css('div#rules-of-poker-accordion').css("strong").each do |name|
    hands_array.push({name: name.text, value: []})
  end

  doc.css('div#rules-of-poker-accordion').css(".rules-cards").each_with_index do |hand, i|
    hand.css('img').each do |card|
      hands_array[i][:value].push card.attr('src')
    end
  end
  hands_array
end
doc.css('div#扑克手风琴规则')
调用返回一个div,因为这就是页面的结构。因此,实际上每个循环只输入一次

该站点的布局有点滑稽,因此您必须分别获取名称和值。这是一个暴力解决方案

def get_all_hands
  doc = Nokogiri::HTML(open('http://www.cardplayer.com/rules-of-poker/hand-rankings'))
  hands_array = []

  doc.css('div#rules-of-poker-accordion').css("strong").each do |name|
    hands_array.push({name: name.text, value: []})
  end

  doc.css('div#rules-of-poker-accordion').css(".rules-cards").each_with_index do |hand, i|
    hand.css('img').each do |card|
      hands_array[i][:value].push card.attr('src')
    end
  end
  hands_array
end

这段特殊的代码就是它无法工作的原因。您正在对每个
strong
进行迭代,将值分配给
hand\u hash
的相同键(
:name
)。下一次迭代也是如此。基本上,在最后一次迭代之前,您将覆盖相同的哈希而不将其保存在任何位置

hands.css('strong').each_with_index do |hand, index|
  hand_hash[index] = hand.text
end
我在您自己的代码中做了一些更改以修复此问题:

doc = Nokogiri::HTML(open('http://www.cardplayer.com/rules-of-poker/hand-rankings'))
hands_array = []
doc.css('div#rules-of-poker-accordion').each do |hands|
  hands.css('strong').zip(hands.css('div.rules-cards')).each do |hand, value|
    hand_hash = {}
    hand_hash[:name] = hand.text
    hand_value = []
    value.css('img').each do |card|
      hand_value << card.attr('src')
      hand_hash[:value] = hand_value
    end
    hands_array << hand_hash #here, now you are saving after each hand
  end
end
hands_array
doc=Nokogiri::HTML(打开)http://www.cardplayer.com/rules-of-poker/hand-rankings'))
指针数组=[]
css文件(“div#扑克牌手风琴规则”)。每个都有手|
hands.css('strong').zip(hands.css('div.rules-cards'))。每个do | hand,value|
hand_hash={}
hand\u hash[:name]=hand.text
hand_值=[]
value.css('img')。每个do |卡|
手动值
[“/packages/cards/Large/Diamond/A-49a04aae5e96d2f948dc2062c2c4fcd5.png”, “/packages/cards/Large/Diamond/K-0bfc14d8f58cc13891b108e4178f92f9.png”, “/packages/cards/Large/Diamond/Q-b981aa1f57642480de1dceaf1c2e810f.png”, “/packages/cards/Large/Diamond/J-d915fc38dbca1ca74cd75dd913de1f3.png”, “/packages/cards/Large/Diamond/T-ef2fe11bbd701e4c5b6681e506271700.png”], {:name=>“2.Straight flush”},{:name=>“3.Four of a kind”,:value=> [“/packages/cards/Large/Heart/J-2bf19067cda29391286416d0d00646d6.png”, “/packages/cards/Large/Diamond/J-d915fc38dbca1ca74cd75dd913de1f3.png”, “/packages/cards/Large/Spade/J-fff29c49da8ca1f7a272c5ac83f51d06.png”, “/packages/cards/Large/Club/J-58b4c0f26e3e0cf8c0772ab3e9e34784.png”, “/packages/cards/Large/Diamond/7-7e507c2122efe10ed7abacab95edff97.png”], {:name=>“4.满座”,value=>
[“/packages/cards/Large/Heart/T-c3f8fd4ffc3e09ec705a817aa212dc86.png”, “/packages/cards/Large/Diamond/T-ef2fe11bbd701e4c5b6681e506271700.png”, “/packages/cards/Large/Spade/T-9a16f63a333b3edeb50c4372f8dd9883.png”, “/packages/cards/Large/Club/9-e6f0020a48aef9907b626477c5a60ac2.png”, “/packages/cards/Large/Diamond/9-3E50083BAFC81A708D195F16D005125.png”], {:name=>“5.Flush”,:value=>
[“/packages/cards/Large/Spade/4-4200c8b5f3f5ba04d9fd5a69d71dab2f.png”, “/packages/cards/Large/Spade/J-fff29c49da8ca1f7a272c5ac83f51d06.png”, “/packages/cards/Large/Spade/8-60d335b08119f600c3ca02aa58fa902d.png”, “/packages/cards/Large/Spade/2-e2d1cee5fc0db0b70990036153d57906.png”, “/packages/cards/Large/Spade/9-b0d71e77734375ceb3954156232f1f2d.png”], {:name=>“6.stright”,:value=>
[“/packages/cards/Large/Club/9-e6f0020a48aef9907b626477c5a60ac2.png”, “/packages/cards/Large/Diamond/8-6cd5b3025be0dd56cd52dfd2a49d922d.png”, “/packages/cards/Large/Spade/7-6c1d119e9c923f8e4773cf00d05e26d6.png”, “/packages/cards/Large/Diamond/6-a0c0218210a1a6c4ec17e5cec17ee3d8.png”, “/packages/cards/Large/Heart/5-f498916a3011c2b7199e1c1008dbe330.png”], {:name=>“7.一类三个”,value=>
[“/packages/cards/Large/Club/7-5610625720208cc02c1107c91365eb37.png”, “/packages/cards/Large/Diamond/7-7e507c2122efe10ed7abacab95edff97.png”, “/packages/cards/Large/Spade/7-6c1d119e9c923f8e4773cf00d05e26d6.png”, “/packages/cards/Large/Club/K-3e8312c33de4718943cd0276de8a16a1.png”, “/packages/cards/Large/Diamond/3-909f8b157151f834c774576c93eae26594.png”], {:name=>“8.Two-pair”,value=>
[“/packages/cards/Large/Club/4-33a9251d25da1ea2ba49e69e94549aee.png”, “/packages/cards/Large/Spade/4-4200c8b5f3f5ba04d9fd5a69d71dab2f.png”, “/packages/cards/Large/Club/3-0C3EDA54CB6808B0A94950C045E497A.png”, “/packages/cards/Large/Diamond/3-909f8b157151f834c774576c93eae26594.png”, “/packages/cards/Large/Club/Q-9fcc4fd7692aa96ba9fcb04fa9fd727d.png”], {:name=>“9.Pair”,:value=>
[“/packages/cards/Large/Heart/A-748f3f87f79ac475e6a432750725b64c.png”, “/packages/cards/Large/Diamond/A-49a04aae5e96d2f948dc2062c2c4fcd5.png”, “/packages/cards/Large/Club/8-c3708e4821723f1100d514e5280b3f32.png”, “/packages/cards/Large/Spade/4-4200c8b5f3f5ba04d9fd5a69d71dab2f.png”, “/packages/cards/Large/Heart/7-1610ff3e74c68f6dd8a855bd1688747.png”], {:name=>“10.高卡”,value=>
[“/packages/cards/Large/Diamond/3-909f8b1571f834c774576c93eae26594.png”, “/packages/cards/Large/Club/J-58b4c0f26e3e0cf8c0772ab3e9e34784.png”, “/packages/cards/Large/Spade/8-60d335b08119f600c3ca02aa58fa902d.png”, “/packages/cards/Large/Heart/4-712ce04b7f2c7e588c48a1e2b46a4244.png”, “/packages/cards/Large/Spade/2-e2d1cee5fc0db0b70990036153d57906.png”]}]


希望它能有所帮助:)

这段特殊的代码就是它无法工作的原因。您正在对每个
strong
进行迭代,将值分配给
hand\u hash
的相同键(
:name
)。下一次迭代也是如此。基本上,在最后一次迭代之前,您将覆盖相同的哈希而不将其保存在任何位置

hands.css('strong').each_with_index do |hand, index|
  hand_hash[index] = hand.text
end
我在您自己的代码中做了一些更改以修复此问题:

doc = Nokogiri::HTML(open('http://www.cardplayer.com/rules-of-poker/hand-rankings'))
hands_array = []
doc.css('div#rules-of-poker-accordion').each do |hands|
  hands.css('strong').zip(hands.css('div.rules-cards')).each do |hand, value|
    hand_hash = {}
    hand_hash[:name] = hand.text
    hand_value = []
    value.css('img').each do |card|
      hand_value << card.attr('src')
      hand_hash[:value] = hand_value
    end
    hands_array << hand_hash #here, now you are saving after each hand
  end
end
hands_array
doc=Nokogiri::HTML(打开)http://www.cardplayer.com/rules-of-poker/hand-rankings'))
指针数组=[]
css文件('
array.map { |element| method(element) }