Open Source im professionellen Einsatz
Linux-Magazin 10/2012
© blas, Fotolia

© blas, Fotolia

Mikroformate zur Planung von Wanderungen nutzen

Ausgezeichnet zu Fuß

Mikroformate zeichnen HTML-Seiten mit allgemein anerkannten Tags aus, zum Beispiel Verbindungen zu sozialen Netzwerken oder Geokoordinaten. Das erlaubt automatischen Auswertern, sie zu sammeln und grafisch aufzubereiten. Nützlich ist das zum Beispiel bei Geodaten zur Routenplanung.

893

Herbstzeit, Wanderzeit! Das warme Wetter Ende September bietet ideale Voraussetzungen, um zum Beispiel in die USA zu fliegen, einen der 58 Nationalparks aufzusuchen und Abenteuer zu erleben (Abbildung 1). Die Wikipedia-Seite "List of national parks of the United States" [2] listet die Parks in alphabetischer Reihenfolge auf, beschreibt die Hauptattraktionen und fügt außerdem im HTML-Text die geografische Breite und Länge als Geokoordinaten bei.

Damit nicht nur Websurfer der Wikipedia-Seite an diese Daten herankommen, sondern auch automatisch ablaufende Applikationen, haben sich so genannte Mikroformate eingebürgert [3]. Denn traditionellerweise kodiert HTML-Markup ja nicht semantische Informationen, sondern konzentriert sich hauptsächlich auf die Darstellung. Steht zum Beispiel auf einer Webseite die Adresse einer Firma, sind Name, Straße, Ort und Telefonnummer oft nur durch Zeilenumbrüche getrennt. Suchmaschinen müssen dann erraten, ob es sich überhaupt um eine Adresse handelt, und anschließend die einzelnen Bestandteile herausfieseln.

Abbildung 1: Der Autor mit Büffel auf freier Wildbahn im Yellowstone-Nationalpark.

Ordnung schaffen

Das in Abbildung 2 gezeigte HTML-Snippet des Tabelleneintrags für den Nationalpark Bryce Canyon auf der genannten Wikipedia-Seite definiert ein Tag »span« der Klasse »vcard« , einer so genannten Root-Klasse, die eine Instanz des Mikroformats »hCard« ausweist [4]. Weiter unten, tief verschachtelt in der Vcard-Struktur, findet sich die Klasse »fn org« , die den Namen »name, formatted/full« der beschriebenen Firma oder Organisation angibt. In diesem Fall ist das Bryce Canyon, der Name des Nationalparks. Vier Zeilen weiter oben steht die Klasse »geo« , die die geografische Breite und Länge eines zentralen Punkts im Park mit »37.57« und »-112.18« angibt.

Abbildung 2: Der HTML-Code für die Wikipedia-Seite des Bryce-Canyon enthält auch die geografische Länge und Breite des Standorts. Diese Angaben lassen sich für eigene, automatisch generierte Karten nutzen.

Diese Angaben mit einem HTML-Parser zu extrahieren ist nicht schwer. Kein Wunder, dass bereits Webapplikationen wie Microform.at bereitstehen. Sie nehmen URLs entgegen, holen die entsprechende Seite ein, extrahieren die semantischen Tags und liefern sie als XML zurück (Abbildung 3). Die angezeigte URL zum XML-Ergebnis wiederum kann der geneigte User dann – wie in [5] beschrieben – in das Suchfeld auf Google Maps plumpsen lassen. In Maps sieht er dann eine lange Textliste mit den Namen der Nationalparks. Klickt er auf einen Eintrag, erscheint auf der rechts daneben angezeigten Amerika-Karte eine Sprechblase, und zwar an der Stelle der Geokoordinaten des jeweiligen Parks.

Google versieht wegen der von Microform.at gewählten Style-Definitionen die Landkarte nicht mit digitalen Reißnägeln sämtlicher Parks. Wenn ein Tourist viele Parks in einem Bundesstaat abklappern möchte, wäre das jedoch hilfreich.

Abbildung 3: Die Webapplikation auf Microform.at nimmt die URL der Wikipedia-Seite entgegen, extrahiert die Microformat-Informationen und formatiert sie als XML.

Modischer Scraper

Zum Glück ist das Auslesen der Vcard-Informationen mit einem in Perl geschriebenen Webscraper nicht weiter schwierig. Wie immer folgt der Perl-Snapshot der neuesten Mode und wählt den modernen »Web::Scraper« vom CPAN. Der von dem Tool Scrapi aus der Ruby-Welt inspirierte Scraper nutzt eine Domain Specific Language (DSL), um in die Tiefen der HTML-Tags vorzudringen und deren Inhalt schön formatiert in Perl-Strukturen zurückzuliefern.

Das CGI-Skript in Listing 1 setzt in Zeile 16 die URL der einzuholenden Wikipedia-Webseite mit den Nationalparks. Der ab Zeile 19 definierte Scraper sucht mit dem Funktionsaufruf »process()« zunächst nach allen »span« -Tags mit dem Attribut »vcard« und legt sie wegen des Parameters »vcard[]« in einem Array innerhalb des Ergebnis-Hash ab.

Wird der Scraper fündig, definiert der erneute, verschachtelte Aufruf ab Zeile 21 einen weiteren Scraper in den Tiefen der Vcard-Struktur. Dieser sucht wegen des Aufrufs »process '.geo'« nach den Tags mit dem Attribut »class=geo« aus Abbildung 2 und extrahiert wegen des Parameters »TEXT« deren Textinhalt, also im Beispiel die Geodaten 37,57 und -112,18. Dann legt er den Textinhalt im Array-Eintrag des Nationalparks unter dem Schlüssel »geo« ab.

Listing 1

parks-scraper

01 #!/usr/bin/perl -w
02 use strict;
03 use Web::Scraper;
04 use URI;
05 use Template;
06 use CGI qw( :all );
07
08 print header(
09  -type =>
10     'application/vnd.google-earth.kml+xml',
11  -content_location => 'microformat.kml',
12  -access_control_allow_origin => '*',
13  -expires                     => '-1d',
14 );
15
16 my $url = "http://en.wikipedia.org/wiki/  .
17           "Us_national_parks";
18
19 my $coords = scraper {
20   process 'span.vcard', 'vcards[]' =>
21     scraper {
22         process '.geo',  geo => 'TEXT';
23         process '.org', name => 'TEXT';
24     }
25 };
26
27 my $res = $coords->scrape(
28     URI->new( $url ) );
29
30 my @parks = ();
31
32 for my $vcard ( @{ $res->{ vcards } } ) {
33   next unless exists $vcard->{ geo };
34   my( $lon, $lat ) =
35       split /\s*;\s*/, $vcard->{ geo };
36   push @parks, { name => $vcard->{ name },
37                  lat  => $lat,
38                  lon  => $lon };
39 }
40
41 my $tmpl = Template->new();
42 my $data = join( '', <DATA> );
43
44 binmode STDOUT, ":utf8";
45
46 $tmpl->process( \$data, { parks =>
47         \@parks } ) || die $tmpl->error();
48
49 __DATA__
50 <?xml version="1.0" encoding="UTF-8"?>
51 <kml
52  xmlns="http://earth.google.com/kml/2.0">
53   <Folder>
54     <name>US National Parks</name>
55     [% FOR park IN parks %]
56     <Placemark>
57       <name>[% park.name %]</name>
58       <Point>
59         <coordinates>
60         [% park.lat %], [% park.lon %], 0
61         </coordinates>
62       </Point>
63     </Placemark>
64     [% END %]
65   </Folder>
66 </kml>

Diesen Artikel als PDF kaufen

Express-Kauf als PDF

Umfang: 4 Heftseiten

Preis € 0,99
(inkl. 19% MwSt.)

Linux-Magazin kaufen

Einzelne Ausgabe
 
Abonnements
 
TABLET & SMARTPHONE APPS
Bald erhältlich
Get it on Google Play

Deutschland

Ähnliche Artikel

  • Perl-Snapshot

    Ein menschlicher Beobachter sieht vieles intuitiv, erfasst zum Beispiel auf einer Karte die Ballungszentren einer zweidimensionalen Punktemenge auf einen Blick. Künstliche Intelligenz tut sich dabei normalerweise schwerer. Das relativ simple K-means-Verfahren jedoch liefert überraschend brauchbare Ergebnisse.

  • Perl-Snapshot Linux-Magazin 2012/10

    Perlmeister Michael Schilli hat seinen Snapshot verfilmt.

  • Semantisches Web

    Viele Webseiten präsentieren Informationen zwar augenfällig formatiert, aber nicht sinnvoll strukturiert. Wer seine HTML-Dokumente dagegen mit Mikroformaten und Mikrodaten anrichtet, macht Adressen, Termine und vieles mehr zum Appetithappen für Suchmaschinen und andere Software.

  • Datenschwein

    So richtig kam das semantische Web bisher nicht in die Gänge. Das Simile-Projekt versucht es anzuschieben und bietet dafür eine ganze Reihe Software-Tools, die bestehende Websites mit semantischen Informationen anreichern. Vollautomatisch geht es aber nicht.

  • Perl-Snapshot

    Mit GPS-Geräten erfassen freiwillige Helfer die Straßen ihrer Heimat für den freien Openstreetmap-Atlas. Ganz pedantische kartografieren auch gleich die Eigenheiten der Parkzone ihres Viertels.

comments powered by Disqus

Ausgabe 09/2017

Artikelserien und interessante Workshops aus dem Magazin können Sie hier als Bundle erwerben.