2014-11-24 2 views
0

나는 마지막 게임의 결과 조건 또는 게임 데이터가있는 마지막 행 (승/패 및 게임 번호)을 기준으로 작은 앱을 만듭니다.가장 최근의 테이블 행과 해당 데이터에 액세스

내 문제는 마지막 행의 첫 번째 열 (가장 최근에 재생 된 게임)에 액세스하는 것입니다. 어떻게 완성 되었습니까?

require 'open-uri' 

class BrooklynPizzaController < ApplicationController 

    def index 
    # URL for dynamic content 
    url = "http://www.basketball-reference.com/teams/BRK/2015_games.html" 

    # Open URL using nokogiri 
    doc = Nokogiri::HTML(open(url)) 

    # Scrape result from Web site 
    @result = doc.css("#teams_games").xpath("//table/tbody/tr/td[8]/text()") 

    # IN PROGRESS - Get date of last game played 
    @result_date = doc.xpath('//table/tbody/tr/td[2]/a/text()') do |link| 
     @result_date[link.text.strip] = link['a'] 
    end 


    ############################################################### 
    # IN PROGRESS - Get number of last game played from 1st column 
    # doc.xpath('//table/tbody/tr/td[1]/text()') do |game| 
    # last_game_number = 
    # end 
    ################################################################ 

    # @result_date = doc.css("#teams_games").xpath("//table/tbody/tr/td[2]/text()") 
    # Set date to current 
    @date = Date.today 

    # Get date of last game played 
    if (@result.last.next == nil) 
     flag = doc.xpath("//table/tbody/tr[#{@result}]") 
     @result_date = doc.xpath("//table/tbody/tr#{flag}/td[2]/a/text()") 
    end 
    end 
end 

Data source 제가 몇 가지를 남겨 두었다 같은 느낌 때문에, 당신을주는거야 정보의 어떤 부족 알려 주시기 바랍니다.

답변

1

이 작업을 수행 할 행을 얻으려면 :

win_loss_tds = doc.css("#teams_games tbody tr td:nth-child(8):not(:empty)").last 
last_win_loss_row = win_loss_tds.last.parent 

가 하나의 XPath 식으로 할 것과 의심 할 여지없이있는 방법입니다,하지만 난하지 않기 때문에 나는 독자에게 연습으로 있음을 떠날거야 XPath를 돌보라.

game_num_col = last_win_loss_row.at("td:first-child") 
game_num = game_num_col.text.to_i 
# => 82 

그리고 두 번째 열에서 날짜를 얻을 :

는이 작업을 수행 할 첫 번째 열에서 게임 번호를 얻으려면

date_col = last_win_loss_row.at("td:nth-child(2)") # XPath: td[2] 
date = DateTime.parse(date_col.text) 
# => 2015-04-15T00:00:00+00:00 

당신은 날짜와 시간을하려는 경우, 이 작업을 수행 할 수 있습니다 :

time_col = last_win_loss_row.at("td:nth-child(3)") 
date_time = DateTime.parse("#{date_col.text} #{time_col.text}") 
# => 2015-04-15T08:00:00-03:00 
+0

'last_row'을 행 x (이 경우, 이미지에서 행/게임 13으로 표시됨), 전체 표의 마지막 행이 아니라 열 8에 W 또는 L (플래그)이있는 가장 최근의 마지막 행을 나타내야합니다. –

+0

[출처] (http://www.basketball-reference.com/teams/BRK/2015_games.html) –

+1

선택자가 애매하고 혼동 될 수있는 경우가 아니면'at_css' (또는'css')를 사용할 필요가 없습니다 XPath. 더 짧은'at '(또는'search')는 보통 올바른 일을합니다. 또한, 속도가 중요하다면'parse'는 날짜 형식을 지정하고'strptime'을 사용하는 것보다 훨씬 느립니다. –

1

를 글쎄, 난이 할 거라고 :

require 'open-uri' 
require 'nokogiri' 
doc = Nokogiri::HTML(open("http://www.basketball-reference.com/teams/BRK/2015_games.html")) 

latest_score_row = doc.search('//tr/td/a[contains(.,"Box Score")]/../..').last 
latest_text = latest_score_row.search('td').map(&:text) 
# => ["13", 
#  "Sat, Nov 22, 2014", 
#  "8:30p EST", 
#  "", 
#  "Box Score", 
#  "@", 
#  "San Antonio Spurs", 
#  "L", 
#  "", 
#  "87", 
#  "99", 
#  "5", 
#  "8", 
#  "L 1", 
#  ""] 

그러나 YMMV.


어떻게 작동합니까? 쉬운. "Box Score"가 포함 된 페이지에서 <a> 노드를 찾은 다음 찾은 각각에 대해 <tr> 노드로 두 레벨을 백업하고 Nokogiri/Ruby에 배열을 반환합니다. last은 마지막으로 발견 된 것을 취합니다.

그런 다음 해당 행에서 <td> 노드를 찾고 텍스트를 가져 오는 것만 큼 문제가됩니다.

스탬프 후, 배열에서 날짜와 시간을 당기는 "오전/오후"의 마사지의 작은 조금을하고 루비는 객체 구축시키는의 문제입니다 시간 :

latest_time = Time.strptime(    
    [ 
    latest_text[1],      # => "Sat, Nov 22, 2014" 
    latest_text[2].sub(/([ap])/, '\1m') # => "8:30pm EST" 
    ].join(' '),       # => "Sat, Nov 22, 2014 8:30pm EST" 
    '%a, %b %d, %Y %H:%M%P %Z'    # => "%a, %b %d, %Y %H:%M%P %Z" 
)          # => 2014-11-22 18:30:00 -0700