use strict; use warnings; use LWP::Simple qw(get); my $url = "http://www.oceanoutlook.com.au/table/perth.html"; my $source = get($url); use HTML::Tree; my $tree = HTML::Tree->new(); $tree->parse($source); my @tds = $tree->look_down( '_tag', 'td' ); my $month = $tds[4]->as_text (); my @headers = ('Date', map {$_->as_text} @tds[5 .. 14]); my @data = map {$_->as_text} @tds[16 .. $#tds - 1]; $_ eq 'Dir' and $_ = "Swell Direction" for @headers; # Output to xml use XML::Writer; my $writer = new XML::Writer(DATA_MODE => 1, DATA_INDENT => 4); $writer->startTag("doc", class => "simple"); $writer->dataElement( 'title', "Swell Forecast"); $writer->dataElement( 'month', $month); while (@data >= @headers) { my ($date, $dir, @values) = splice @data, 0, @headers; $writer->startTag ("prediction", date => $date); $writer->dataElement ('title', $date); $writer->dataElement ('item', $dir, name => $headers[1]); $writer->startTag ("swell_height"); $writer->dataElement ('unit', 'meters'); $writer->dataElement ('item', $values[$_], name => $headers[$_ + 2]) for 0 .. 2; $writer->endTag(); $writer->startTag ("peak_period"); $writer->dataElement ('unit', 'seconds'); $writer->dataElement ('item', $values[$_], name => $headers[$_ + 2]) for 3 .. 6; $writer->endTag(); $writer->startTag ("wind"); $writer->dataElement ('unit', 'knots'); $writer->dataElement ('item', $values[$_], name => $headers[$_ + 2]) for 7 .. 9; $writer->endTag(); $writer->endTag(); # Close prediction } $writer->endTag(); # Close doc $writer->end(); exit;