9

Như tôi đã đề cập trong bài viết trước, tôi muốn thêm các trò chơi được truyền hình trực tuyến vào biểu đồ bóng đá của mình và trang web Premier League có vẻ như là trường hợp tốt nhất để tìm ra những trò chơi nào.

Ban đầu tôi đã thử sử dụng Nokogiri để lấy dữ liệu mà tôi muốn

> require 'nokogiri'
> require 'open-air'
> tv_times = Nokogiri::HTML(open('http://www.premierleague.com/en-gb/matchday/broadcast-schedules.tv.html?rangeType=.dateSeason&country=GB&clubId=ALL&season=2012-2013&isLive=true'))

Tuy nhiên, khi tôi cố gắng truy vấn bằng bộ chọn CSS cho tất cả các kết quả khớp thì không có gì quay lại:

> tv_times.css(".broadcastschedule table.contentTable tbody tr")
=> []

Tôi hơi ngạc nhiên nhưng đọc ở đâu đó rằng tôi nên kiểm tra nếu có bất kỳ lỗi nào trong khi phân tích tài liệu. Trong thực tế đã có khá nhiều!

> tv_times.errors
=> [#<Nokogiri::XML::SyntaxError: Element script embeds close tag>, #<Nokogiri::XML::SyntaxError: Element script embeds close tag>, #<Nokogiri::XML::SyntaxError: Element script embeds close tag>, #<Nokogiri::XML::SyntaxError: Element script embeds close tag>, #<Nokogiri::XML::SyntaxError: Element script embeds close tag>, #<Nokogiri::XML::SyntaxError: Element script embeds close tag>, #<Nokogiri::XML::SyntaxError: Element script embeds close tag>, #<Nokogiri::XML::SyntaxError: Element script embeds close tag>, #<Nokogiri::XML::SyntaxError: Element script embeds close tag>, #<Nokogiri::XML::SyntaxError: Element script embeds close tag>, #<Nokogiri::XML::SyntaxError: Element script embeds close tag>, #<Nokogiri::XML::SyntaxError: Element script embeds close tag>, ...]

Tôi đã chạy tài liệu thông qua dịch vụ xác thực đánh dấu W3C và dường như không tìm thấy bất kỳ vấn đề nào với nó.

Tiếp theo, tôi đã thử tước bỏ tất cả các thẻ script bằng loofah trước khi gỡ bỏ chúng một cách thủ công nhưng cả hai cách tiếp cận này đều không giúp được gì.

Trước đây tôi đã sử dụng Trình điều khiển web để quét các trang web nhưng tôi thấy rằng Nokogiri nhanh hơn nhiều nên tôi đã ngừng sử dụng nó.

Vì thư viện mới của tôi không chơi bóng, tôi nghĩ rằng tôi sẽ nhanh chóng xem liệu Web Driver có vượt qua thử thách hay không và thực sự đó là:

require "selenium-webdriver"
 
driver = Selenium::WebDriver.for :chrome
driver.navigate.to "http://www.premierleague.com/en-gb/matchday/broadcast-schedules.tv.html?rangeType=.dateSeason&country=GB&clubId=ALL&season=2012-2013&isLive=true"
 
matches = driver.find_elements(:css, '.broadcastschedule table.contentTable tbody tr')
matches.each do|tr| 	
  match = tr.find_element(:css, "td.show a").text
  broadcaster = tr.find_element(:css, "td.broadcaster img").attribute("src")
  tv_channel = broadcaster.include?("sky-sports") ? "Sky" : "ESPN"
 
  puts "#{match},#{tv_channel}"
end
 
driver.quit


$ ruby tv_games.rb 
Newcastle United vs Tottenham Hotspur,ESPN
Wigan Athletic vs Chelsea,Sky
Manchester City vs Southampton,Sky
Everton vs Manchester United,Sky
Swansea City vs West Ham United,Sky
Chelsea vs Newcastle United,ESPN
...

Lý tưởng nhất là tôi muốn sử dụng Nokogiri để thực hiện công việc này nhưng nó đã quyết định rằng tài liệu này không hợp lệ và nó không thể phân tích chính xác vì vậy Web Driver là một sự thay thế khá tốt mà tôi nghĩ!



|