我有一个Rake任务设置,它几乎我的工作方式。
我正在从网站上抓取信息,并希望将所有玩家评分都放入一个数组中,按照它们在HTML中的显示方式排序。我有player_ratings
并希望完全按照player_names
变量执行操作。
我只希望在文档的指定部分中<td>
内的第四个<tr>
,因为这对应于评分。如果我使用Nokogiri的text
,我只获得第一个玩家评分时,我真的想要一个所有人的数组。
task :update => :environment do
require "nokogiri"
require "open-uri"
team_ids = [7689, 7679, 7676, 7680]
player_names = []
for team_id in team_ids do
url = URI.encode("http://modules.ussquash.com/ssm/pages/leagues/Team_Information.asp?id=#{team_id}")
doc = Nokogiri::HTML(open(url))
player_names = doc.css('.table.table-bordered.table-striped.table-condensed')[1].css('tr td a').map(&:content)
player_ratings = doc.css('.table.table-bordered.table-striped.table-condensed')[1].css('tr td')[3]
puts player_ratings
player_names.map{|player| puts player}
end
end
有关如何执行此操作的建议吗?
答案 0 :(得分:1)
我认为更改xpath
可能有所帮助。这是xpath
nodes = doc.xpath "//table[@class='table table-bordered table-striped table-condensed'][2]//tr/td[4]"
data = nodes.each {|node| node.text }
用node.text
迭代节点给我
4.682200
5.439000
5.568400
5.133700
4.480800
4.368700
2.768100
3.814300
5.103400
4.567000
5.103900
3.804400
3.737100
4.742400
答案 1 :(得分:0)
我建议使用Wombat(https://github.com/felipecsl/wombat),您可以在其中指定要检索由css选择器匹配的元素列表,它将为您完成所有艰苦工作
答案 2 :(得分:0)
它并不为人所知,但是Nokogiri实现了一些 jQuery的JavaScript扩展,用于使用CSS选择器进行搜索。在您的情况下,:eq(n)
方法将非常有用:
require 'nokogiri'
doc = Nokogiri::XML(<<EOT)
<html>
<body>
<table>
<tr>
<td>1</td>
<td>2</td>
<td>3</td>
<td>4</td>
</tr>
</table>
</body>
</html>
EOT
doc.at('td:eq(4)').text # => "4"