如何创建一个数据抓取HTML?

时间:2014-03-29 02:44:33

标签: ruby nokogiri

我有一个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

有关如何执行此操作的建议吗?

3 个答案:

答案 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"