暫定的に完成しました: 銀座ルノアール
Perlのコード
# === Libraries ===
use strict;
use warnings;
use URI;
use Web::Scraper;
use YAML;
use Data::Dumper;
use Encode;
use utf8;
use HTML::Template;
# use encoding "utf8", STDOUT => "utf8";
use Geography::AddressExtract::Japan;
use WebService::Simple;
my @address;
my @array;
# === Main part ===
my $frame = scraper {
process '//td[@class="line_a" and @bgcolor="#ffffff"]//a',
'shop[]' => '@href';
};
my $res =
$frame->scrape( URI->new("http://www.ginza-renoir.co.jp/renoir/index.htm") );
foreach my $x ( @{ $res->{shop} } ) {
my $part = scraper {
process
'/html[1]/body[1]/center[2]/center[1]/table[1]/tbody[1]/tr[1]/td[2]/table[1]/tbody[1]/tr[1]/td[1]/table[1]/tbody[1]/tr[1]/td[1]/table[@class="size2"]/tbody[1]/tr[1]/td[2]',
'shop' => 'TEXT';
process
'/html[1]/body[1]/center[2]/center[1]/table[1]/tbody[1]/tr[1]/td[2]/table[1]/tbody[1]/tr[1]/td[1]/table[1]/tbody[1]/tr[1]/td[1]/table[@class="size2"]/tbody[1]/tr[3]/td[2]',
'address' => 'TEXT';
};
my $result = $part->scrape( URI->new($x) );
foreach my $addr ( $result->{address} ) {
my $t = Geography::AddressExtract::Japan->extract($addr);
my $work = $t->[]->{"city"} . $t->[]->{"aza"} . $t->[]->{"number"};
my $latlng = &getLatLng($work);
my ( $lng, $lat ) = split( /,/, $latlng );
push( @array, { lat => $lat, lng => $lng } );
}
}
my $tmpl = HTML::Template->new( filename => 'googlemap.tt' );
$tmpl->param( DATASET => \@array );
print $tmpl->output;
sub getLatLng() {
my $arg = shift();
my $geocode = WebService::Simple->new(
base_url => "http://maps.google.com/maps/geo",
param => {
output => 'xml',
hl => 'ja',
ie => 'UTF8',
oe => 'UTF8',
}
);
my $response = $geocode->get( { q => $arg, } );
if ( $response->parse_response()->{Response}->{Status}->{code} == 200 ) {
return $response->parse_response()->{Response}->{Placemark}->{Point}
->{coordinates};
}
else {
return 'Not Found, Not Found';
}
}
テンプレート用のファイル
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
<title>GoogleMaps Test</title>
<meta name="Content-Type" content="text/html; charset=UTF-8" />
<script type="text/javascript" src="http://maps.google.co.jp/maps?file=api&v=2&key=ABQIAAAAi7tMvJT0pMWzzgIPgaKRWhS4ltLnHR4dqto9lWrc1i-hPbZKVRRG70Vj11-gAnxyxcGtaalOIUBpBA" charset="utf-8"></script>
<script type="text/javascript">
//<![CDATA[
var map;
function startUp() {
map = new GMap2( document.getElementById("mymap"));
map.setCenter( new GLatLng(35.9072644, 139.4841802), 10 );
map.addControl(new GSmallMapControl());
map.addControl(new GMapTypeControl());
<TMPL_LOOP NAME=DATASET>
createMarker(<TMPL_VAR NAME=lat>, <TMPL_VAR NAME=lng>);
</TMPL_LOOP>
function createMarker(lat, lng) {
var mk = new GMarker( new GLatLng(lat, lng) );
map.addOverlay(mk);
GEvent.addListener(mk, "click", function() { mk.openInfoWindowHtml( "memo" );});
}
}
onload = startUp;
onunload = GUnload;
</script>
<style type="text/css">
html, body {
width: 100%;
height: 100%;
}
html {
overflow: hidden;
}
body {
margin: 0px 0px 0px 0px;
padding: 0px 0px 0px 0px;
}
#top {
top: 0px;
left: 0px;
width: 100%;
height: 15%;
}
#mymap {
width: 80%;
height: 100%;
}
</style>
</head>
<body>
<div id="mymap"></div>
</body>
<hr>
</body>
</html>
生成されるHTML
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
<title>GoogleMaps Test</title>
<meta name="Content-Type" content="text/html; charset=UTF-8" />
<script type="text/javascript" src="http://maps.google.co.jp/maps?file=api&v=2&key=ABQIAAAAi7tMvJT0pMWzzgIPgaKRWhS4ltLnHR4dqto9lWrc1i-hPbZKVRRG70Vj11-gAnxyxcGtaalOIUBpBA" charset="utf-8"></script>
<script type="text/javascript">
//<![CDATA[
var map;
function startUp() {
map = new GMap2( document.getElementById("mymap"));
map.setCenter( new GLatLng(35.9072644, 139.4841802), 10 );
map.addControl(new GSmallMapControl());
map.addControl(new GMapTypeControl());
createMarker(35.7320865, 139.7138439);
createMarker(35.7321420, 139.7128801);
createMarker(35.7331675, 139.7398948);
createMarker(35.7080096, 139.7599332);
createMarker(35.6197692, 139.7293858);
createMarker(35.7067903, 139.6663186);
createMarker(35.7081818, 139.6653381);
createMarker(35.6733528, 139.7675810);
createMarker(35.6739055, 139.7669699);
createMarker(35.6727390, 139.7676699);
createMarker(35.6723169, 139.7690560);
createMarker(35.6727445, 139.7652145);
createMarker(35.6688283, 139.7642480);
createMarker(35.6685117, 139.7676728);
createMarker(35.6814104, 139.7726638);
createMarker(35.6852072, 139.7762885);
createMarker(35.6813936, 139.7699945);
createMarker(35.6810853, 139.7702779);
createMarker(35.5889452, 139.7292928);
createMarker(35.5612929, 139.7148402);
createMarker(35.7078879, 139.7760349);
createMarker(35.7109514, 139.7743599);
createMarker(35.7100098, 139.7731878);
createMarker(35.7276245, 139.7689179);
createMarker(35.6903637, 139.7361271);
createMarker(35.6992491, 139.7452177);
createMarker(35.7017628, 139.7515561);
createMarker(35.6910813, 139.7685749);
createMarker(35.6927284, 139.7706636);
createMarker(35.6912064, 139.7712053);
createMarker(35.6738081, 139.7604648);
createMarker(35.6973334, 139.7726883);
createMarker(35.6995304, 139.7710245);
createMarker(35.6978834, 139.7747021);
createMarker(35.7058512, 139.6505642);
createMarker(35.6903875, 139.6958309);
createMarker(35.6893044, 139.6982473);
createMarker(35.6927540, 139.6981833);
createMarker(35.6943759, 139.6943865);
createMarker(35.6911878, 139.7078073);
createMarker(35.6907822, 139.7056270);
createMarker(35.6926912, 139.7355798);
createMarker(35.6862696, 139.7289917);
createMarker(35.6945067, 139.7035410);
createMarker(35.6945705, 139.7019745);
createMarker(35.6950454, 139.7004413);
createMarker(35.6941316, 139.6992943);
createMarker(35.6949732, 139.6981916);
createMarker(35.7016167, 139.6955250);
createMarker(35.7018002, 139.6991329);
createMarker(35.7139962, 139.7050011);
createMarker(35.7125354, 139.7071981);
createMarker(35.7121909, 139.7042068);
createMarker(35.7119659, 139.7041790);
createMarker(35.6816777, 139.7019528);
createMarker(35.6809585, 139.7100715);
createMarker(35.6560085, 139.7015788);
createMarker(35.6591388, 139.7043812);
createMarker(35.6620215, 139.6972123);
createMarker(35.6614745, 139.7025757);
createMarker(35.7321156, 139.7675873);
createMarker(35.7282051, 139.7721982);
createMarker(35.6763293, 139.7366666);
createMarker(35.6648119, 139.7562514);
createMarker(35.6684642, 139.7571124);
createMarker(35.6462388, 139.7470472);
createMarker(35.6567100, 139.7538879);
createMarker(35.6290796, 139.7429121);
createMarker(35.6304154, 139.7378514);
createMarker(35.6976951, 139.8253644);
createMarker(35.7704183, 139.8711235);
createMarker(35.6966468, 139.4146625);
createMarker(35.6987800, 139.4151235);
createMarker(35.7009965, 139.4155373);
createMarker(35.7038828, 139.5603612);
createMarker(35.4413525, 139.6502110);
createMarker(35.4441327, 139.6367062);
createMarker(35.4436606, 139.6320260);
createMarker(35.5082843, 139.6776540);
createMarker(35.3194949, 139.5511114);
createMarker(35.3537686, 139.5323658);
createMarker(35.5297282, 139.6991820);
createMarker(35.5314140, 139.7010568);
createMarker(35.2308553, 139.1015186);
createMarker(35.9072644, 139.4841802);
createMarker(35.7223281, 139.9278380);
function createMarker(lat, lng, memo) {
var mk = new GMarker( new GLatLng(lat, lng) );
map.addOverlay(mk);
GEvent.addListener(mk, "click", function() { mk.openInfoWindowHtml( memo );});
}
}
onload = startUp;
onunload = GUnload;
</script>
<style type="text/css">
html, body {
width: 100%;
height: 100%;
}
html {
overflow: hidden;
}
body {
margin: 0px 0px 0px 0px;
padding: 0px 0px 0px 0px;
}
#top {
top: 0px;
left: 0px;
width: 100%;
height: 15%;
}
#mymap {
width: 80%;
height: 100%;
}
</style>
</head>
<body>
<div id="mymap"></div>
</body>
<hr>
</body>
</html>