我想重拍2012年伦敦奥运会的奖牌,以更好地体现奖牌的价值目前只按金牌分类。我想按点数重新列出它,所以gold=4,silver=2和brown=1来创建一个更合理的新列表我可能想记住以前的排名,然后再添加一个新的排名列。
我想尝试mechanize从站点获取原始数据,然后将数据解析为行和列,应用新计数,然后重新生成列表。
http://www.london2012.com/medals/medal-count/的来源来看,每个国家都有这样一块奖牌:

<span class="countryName">Canada</span></a></div></div></td><td class="gold c">0</td><td class="silver c">2</td><td class="bronze c">5</td>

如果我使用agent.get('http://www.london2012.com/奖牌/medal count'),它将显示整个列表。如何解析特定的跨度和表数据?
我还需要记住排名,然后当我使新的网页把新的排名旁边。
任何关于机械化解析和记住数据的技巧都会非常有用。更重要的是你在做这样的事情时的思维过程,我会感谢你帮助我开始。这不一定是密码答案
谢谢

最佳答案

首先确定表格在chrome中加载页面并右键单击表上的任意位置。检查元件上议院直到你坐到桌上现在选择它,您将看到它如下所示:

<table class="or-tbl overall_medals sortable" summary="Schedule">

整个_奖牌类看起来会是独特的,所以这是一个很好的使用。现在启动IRB并执行以下操作:
require 'mechanize'
agent = Mechanize.new
page = agent.get 'http://www.london2012.com/medals/medal-count/'

仔细检查表是否唯一:
page.search('table.overall_medals').size
#=> 1 (good, it is)

可以使用以下命令将表中的所有数据获取到数组中:
page.search('table.overall_medals tr').map{|tr| tr.search('td').map(&:text)}

注意前两行是空的,让我们使用一个范围来删除它们:
data = page.search('table.overall_medals tr')[2..-1].map{|tr| tr.search('td').map(&:text)}

第二行不是真的空的,它有列名(用th代替td)。你可以用:
columns = page.search('table.overall_medals tr[2] th').map{|th| th.text.strip}

您可以使用以下命令将这些数据放入散列:
rows = data.map{|row| Hash[columns.zip row]}

现在你可以了
rows[0]['Country']
#=> "United States of America"

甚至是一个大杂烩:
countries = rows.map{|row| {row['Country'] => row}}.reduce &:merge

现在:
countries['France']['Gold']
#=> "8"

关于ruby - 使用Ruby和Mechanize来计算新的奥运奖牌,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11804226/

10-15 13:09