Programmierung

HTML-Dokumente zerlegen mit HTML::TreeBuilder

08. Juli 2011 · Programmierung · andreas · 1 Kommentar

Geht es um das Extrahieren von Informationen aus einem HTML-Dokument, so bietet sich Perl als “the Swiss Army chainsaw of programming languages” geradezu an und bietet unzählige Wege ans Ziel. Nicht nur gibt es die mächtige RegEx-Engine, auch im CPAN gibt es eine Vielzahl von Modulen, die für den Einsatzzweck geeignet scheinen.

Ein Modul, das ein gutes Verhältnis zwischen Aufwand und erzieltem Ergebnis verspricht, ist HTML::TreeBuilder, dessen Einsatz am Beispiel eines Flickr-Fotoalbums demonstriert werden soll:

Nach der Initialisierung des HTML::TreeBuilder-Objekts genügt ein Aufruf von “parse” oder wahlweise “parse_file” auf eine z.B. mittels “LWP::Simple” heruntergeladene Datei, damit der HTML-Tree zur weiteren Verarbeitung zur Verfügung steht.

$tree = HTML::TreeBuilder->new; $tree->parse($page);

Die einzelnen Thumbnails eines Albums sind bei flickr jeweils in ein “div”-Element eingebettet, dem die Klasse “thumb” zugewiesen ist.

<div class="thumb"> <span> <a title="..." href="..."> <img width="75" height="75" border="0" alt="..." src="..."> </a> </span> </div>

Um eine Liste aller Thumbnail-Elemente zu erhalten, genügt der Aufruf von “find_by_attribute” mit passenden Parametern

@urllist = $tree->find_by_attribute('class', 'thumb');

der den gesamten Dokument-Tree durchläuft und eine Liste aller Elemente mit Klasse “thumb” zurückliefert, die dann einzeln abgearbeitet werden können.

Die Links zu den jeweiligen Bilderseiten können dann über den Aufruf zweier weiterer Funktionen etxrahiert werden:

foreach $thumb (@urllist) { $link = $thumb->find_by_tag_name('a'); print $link->attr('href'); }

Der Aufruf von “find_by_tag_name” lokalisiert das Link-Element innerhalb des “div”-Elements, mittels “attr” kann auf dessen “href”-Attribut zugegriffen werden.

Das

Download (vollständige Beispielskript; RAR-archive; 0kB)

, das mittels

flickldr.pl http://www.flickr.com/photos/<werauchimmer>/sets/<wasauchimmer>/

aufgerufen wird, ist lediglich als Demo zur Verwendung von HTML::Template zu sehen und alles andere als ein zuverlässiger Downloader für Flickr-Alben. Neben fehlendem Fehlerhandling gibt es auch keinerlei Option(en) zur Wahl der Fotogröße - es wird einfach davon ausgegangen, daß alles wie gewünscht verfügbar ist.

Seit dem Relaunch von Flickr am 20. Mai 2013 können mit dem Skript keine Alben mehr heruntergeladen werden.

Exif-Daten ändern

04. Mai 2011 · Programmierung · andreas · Kein Kommentar

Sollen Exif-Daten vorhandener Bild-Dateien geändert werden, so ist - wie so oft im adminstrativen Alltag - PERL ein hilfreiches Werkzeug.

Folgendes Skript schnappt sich alle “JPG”-Dateien im aktuellen Verzeichnis und setzt deren Aufnahmedatum auf den 01.09.2004 9:22:57 Uhr.

exitdate.pl
use strict; use warnings; use Image::ExifTool; my (@files, $file, $image, $success); opendir(DIR, '.'); @files = readdir(DIR); closedir(DIR); foreach $file (@files) { next if $file !~ /\.jpg$/i; print "processing file '$file'\n"; my $image = new Image::ExifTool; $image->SetNewValue('DateTimeOriginal', '2004:09:01 09:22:57'); $success = $image->WriteInfo($file, '_' . $file); die 'Error: \'' . $image->GetValue('Error') . '\'' if ! $success; }

Die komplette Doku zu Image::ExifTool findet sich im CPAN. Wer mutig ist (oder ein Backup hat), kann den zweiten Parameter bei WriteInfo auch weglassen - die Quelldatei wird dann direkt überschrieben.


Groß- und Kleinschreibung bei SQLite

20. März 2011 · Programmierung · andreas · Kein Kommentar

Eine der Stolperfallen beim Wechsel zwischen MySQL und SQLite ist, daß SQLite in der Standardeinstellung z.B. bei SELECT-Statements zwischen Groß- und Kleinschreibung unterscheidet. Ein

SELECT * FROM meinetabelle WHERE meinfeld = 'test';

wird zwar eine Zeile mit meinfeld = ’test’ finden, für eine vorhandene Zeile mit meinfeld = ‘Test’ aber kein Ergebnis zurückliefern. Möchte man das SELECT ohne Berücksichtigung von Groß - und Kleinschreibung durchführen, so kann dies durch das Anhängen von ‘COLLATE NOCASE’ erfolgen, also

SELECT * FROM meinetabelle WHERE meinfeld = 'test' COLLATE NOCASE;

womit auch ‘Test’, ’tEst’, ‘TEST’ und noch ein paar andere Schreibweisen gefunden werden.

Möchte man das Verhalten für einzelne Tabellen von Anfang an umstellen, so kann ‘COLLATE NOCASE’ auch entweder direkt bei der Spaltendefinition oder beim Erzeugen eines Indexes angegeben werden.


CPAN mit ActivePerl

09. Dezember 2010 · Programmierung · andreas · Kein Kommentar

Auch wenn sich “Perl unter Windows: Erdbeere oder Komodowaran?” auf den ersten Blick etwas anders lesen mag, auch unter ActivePerl ist ein Zugriff auf das Comprehensive Perl Archive Network (CPAN) ohne große Klimmzüge möglich - nur um’s im Mozilla-Jargon zu sagen “Hier endet möglicherweise die Gewährleistung!”.

Die CPAN-Shell ist zwar nicht im Startmenü verlinkt, kann aber von der Kommandozeile mittels Eingabe von “cpan” gestartet werden. Je nach verwendeter Windows-Installation und Installationsverzeichnis muß dies u.U. als Administrator geschehen, um die benötigten Schreibrechte zu erhalten.

CPAN Screenshot

Sollte ActivePerl keinen installierten C-Compiler vorfinden, wird analog zu Strawberry Perl die Minimalist GNU for Windows-Umgebung MinGW zusammen mit “dmake” über den Perl Package Manager installiert und konfiguriert, so daß anschließend eine voll funktionsfähige CPAN-Shell zur Verfügung steht.


Windows-Theming mit Visual Studio 6

04. Dezember 2010 · Programmierung · andreas · Kein Kommentar

Um einem Visual Studio 6-Projekt den aktuellen Window-Stil (XP / Vista / 7) hinzuzufügen, muß zuerst eine XML-Datei unter dem Namen “manifest.xml” erstellt werden:

manifest.xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> <assemblyIdentity processorArchitecture="x86" version="5.1.0.0" type="win32" name="__Name der .EXE-Datei__"/> <description>__Beschreibung der .EXE-Datei__</description> <dependency> <dependentAssembly> <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" publicKeyToken="6595b64144ccf1df" language="*" processorArchitecture="x86"/> </dependentAssembly> </dependency> </assembly>

Anschließend den Dialog zum Hinzufügen einer neuen Resource mittels “Einfügen” / “Resource” (oder wahlweise Strg+R) öffnen und auf “Importieren” klicken.

Den Dateityp auf “Alle Dateien (.)” ändern, die bereits erzeugte “manifest.xml” anwählen und auf “Importieren” klicken.

Im sich nun öffnenden Dialog “Benutzerdefinierte Ressourcentyp” als Typ “24” eingeben und mit “OK” bestätigen.

Anschließend mittels Rechtsklick die Eigenschaften der soeben erzeugten Ressource öffnen und die ID auf “1” ändern.

Das Projekt neu erstellen.