| 1 |
|
|---|
| 2 |
use strict; |
|---|
| 3 |
use utf8; |
|---|
| 4 |
use DateTime; |
|---|
| 5 |
use DateTime::Format::W3CDTF; |
|---|
| 6 |
use Encode; |
|---|
| 7 |
use LWP::Simple (); |
|---|
| 8 |
use HTML::TreeBuilder::XPath; |
|---|
| 9 |
use URI; |
|---|
| 10 |
use YAML; |
|---|
| 11 |
|
|---|
| 12 |
my $url = "http://www.jsports.co.jp/tv/football/card/football.html"; |
|---|
| 13 |
my $html = decode('shift_jis', LWP::Simple::get($url)); |
|---|
| 14 |
my $tree = HTML::TreeBuilder::XPath->new; |
|---|
| 15 |
$tree->parse($html); |
|---|
| 16 |
$tree->eof; |
|---|
| 17 |
|
|---|
| 18 |
my $feed = { |
|---|
| 19 |
title => 'JSPORTS 海外サッカー放送スケジュール', |
|---|
| 20 |
link => $url, |
|---|
| 21 |
}; |
|---|
| 22 |
|
|---|
| 23 |
my @cols = $tree->findnodes(q(//table[@class='leagueTitle']/tr/td/h3|//table[@class='scheduleTable']/tr/td)); |
|---|
| 24 |
|
|---|
| 25 |
my $current_league; |
|---|
| 26 |
while (my $node = shift @cols) { |
|---|
| 27 |
if ($node->tag eq 'h3') { |
|---|
| 28 |
$current_league = $node->as_text; |
|---|
| 29 |
next; |
|---|
| 30 |
} |
|---|
| 31 |
|
|---|
| 32 |
my($date, $hour, $title, $mark, $card, $channel) = ($node, splice(@cols, 0, 5)); |
|---|
| 33 |
|
|---|
| 34 |
push @{$feed->{entry}}, { |
|---|
| 35 |
title => $title->as_text . " " . $card->as_text, |
|---|
| 36 |
date => munge_datetime($date->as_text, $hour->as_text), |
|---|
| 37 |
tags => [ $mark->content->[0]->attr('alt'), $channel->as_text, $current_league ], |
|---|
| 38 |
}; |
|---|
| 39 |
} |
|---|
| 40 |
|
|---|
| 41 |
binmode STDOUT, ":utf8"; |
|---|
| 42 |
print YAML::Dump $feed; |
|---|
| 43 |
|
|---|
| 44 |
sub munge_datetime { |
|---|
| 45 |
my($date, $hour) = @_; |
|---|
| 46 |
|
|---|
| 47 |
|
|---|
| 48 |
$date =~ m!^(\d{1,2})月(\d{1,2})日! or die "No match: $date"; |
|---|
| 49 |
my($month, $day) = ($1, $2); |
|---|
| 50 |
$hour =~ m!^(\d{1,2}):(\d\d)$! or die "No match: $hour"; |
|---|
| 51 |
($hour, my $min) = ($1, $2); |
|---|
| 52 |
|
|---|
| 53 |
my $dt = DateTime->new( |
|---|
| 54 |
year => DateTime->now->year, |
|---|
| 55 |
month => $month, |
|---|
| 56 |
day => $day, |
|---|
| 57 |
hour => $hour >= 24 ? $hour - 24 : $hour, |
|---|
| 58 |
minute => $min, |
|---|
| 59 |
time_zone => 'Asia/Tokyo', |
|---|
| 60 |
); |
|---|
| 61 |
$dt->add( days => 1 ) if $hour >= 24; |
|---|
| 62 |
|
|---|
| 63 |
return DateTime::Format::W3CDTF->format_datetime($dt); |
|---|
| 64 |
} |
|---|