Script zur Extrahation von Informationen aus Dateien

Josef 'Jupp' Schugt jupp at gmx.de
Fr Sep 5 01:03:09 CEST 2008


On Thu, 04 Sep 2008 22:39:49 +0200, Dr. Uwe Döbereiner <udoebus at kud.com>  
wrote:

> Mir fehlt noch sehr viel mehr.
>
> Nämlich wenigstens _ein_ konkreter Vorschlag, wie so in etwa die  
> Fragestellung mit den jeweils vorgeschlagenen Sprachen angegangen werden  
> könnte. So einer Art Stub mit dem entsprechenden Code in der empfohlenen  
> Sprache.

Ich hätte gerne beschrieben, wie man die fraglichen XML-Dateien mit einem  
Ruby-Skript verarbeitet, doch ich bin kein Freund des  
Im-Nebel-Herumstocherns und bislang hat Guido keine komplette XML-Datei  
zur Verfügung gestellt, die das zu verarbeitende Format darstellt.

Aus diesem Grund habe ich zur Illustration der Vorgehensweise auf eine  
real existierende XML-Datei - nämlich  
http://www.animaxtv.de/cds/wochenoverview.xml.jsp - und ein ebenso real  
existierendes Ruby-Skript zu ihrer Verarbeitung nebst eines Beispiels, das  
die von diesem Skript erzeugte Ausgabe illustriert -  
http://penpen.goodaddress.eu/?p=287 - hingewiesen.

Wenn dieses Beispiel nicht konkret genug war, dann bitte ich das zu  
entschuldigen; möglicherweise habe ich das Abstraktionsvermögen der  
Listennutzer überschätzt.

Das aus diesem ursprünglichen Skript entstandene Programm, das sich unter  
http://penpen.goodaddress.eu/?p=238 findet, verwendet erb (embedded Ruby)  
und lädt bei Bedarf Zusatzinformationen nach. Es ist daher  
unübersichtlicher als das ursprüngliche Skript und für die Illustration  
der Vorgehensweise weniger geeignet; dafür befindet es sich es sich nun  
schon seit einem Dreivierteljahr unverändert im Einsatz und hat sich in  
dieser Zeit bestens bewährt.

Aber wenn es denn sein muss, hier ein kurzer Ausschnitt aus der XML-Datei

<weekOverview>
   <programs>
     <day dayLabel="Donnerstag" date="04.09.">
       <program>
         <titel>Eureka Seven</titel>
         <type>Lifestyle</type>
         <startTime>05:30</startTime>
         <duration>00:25:00</duration>
         <image>/Bilder/Animax/Programm/Eureka_Seven/eureka_ep_small.jpg</image>
         <country>Japan</country>
         <year>2005</year>
         <episode_name>Differencia</episode_name>
         <episode_number>23</episode_number>
         <highlight>false</highlight>
         <link>http://www.animaxtv.de/cds/seriespage.xml.jsp?type=Lifestyle&version=o&language=de&contentId=95901</link>
       </program>
       <program>...</program>
       <program>...</program>
       <program>...</program>
       :
     </day>
     <day dayLabel="Freitag" date="05.09.">...</day>
     <day ...>...</day>
     <day ...>...</day>
   </programs>
</weekOverview>

Und hier das auf seine Essenz zusammengestrichene Rubyskript

#!/usr/bin/env ruby

require 'rexml/document'
require 'net/http'

doc = Net::HTTP.get('www.animaxtv.de', '/cds/wochenoverview.xml.jsp')

REXML::Document.new(doc).elements.each('weekOverview/programs/day') do  
|day|
   dayLabel = day.attributes['dayLabel']
   date     = day.attributes['date']
   day.elements.each('program') do |prog|
     puts <<EOF
#{date} #{prog.elements['startTime'].text}  
(#{prog.elements['duration'].text})
#{prog.elements['titel'].text}: #{prog.elements['episode_name'].text}  
(#{prog.elements['episode_number'].text})

EOF
   end
end

Dieses Beispiel ist ein voll funktionsfähiges Skript zur Verarbeitung des  
Animax-Programms, das mit den aktuellen Daten folgende sehr einfache  
Ausgabe erzeugte:

04.09. 05:30 (00:25:00)
Eureka Seven: Differencia (23)

04.09. 05:55 (00:25:00)
Gundam Seed: Der ewige Tanz (27)

04.09. 06:20 (00:25:00)
Samurai 7: Zweigeteilt! (9)

04.09. 06:45 (00:30:00)
Last Exile: Castling Lucciola (23)

04.09. 07:15 (00:25:00)
Black Cat: The Cat Unleased (10)

:

Das Skript ist in nicht einmal einer Stunde entstanden. Dazu sollte ich  
anmerken, dass ich den größten Teil der Zeit dafür aufgewendet habe,  
herauszufinden, wie ich an die benötigten Daten gelangen. Dies war eine  
nicht ganz triviale Aufgabe, da die Site vollständig in Flash realisiert  
ist. Es bedurfte des Logfiles eines lokalen Squid-Proxys um  
herauszufinden, welche Daten von Flash nachgeladen werden. Das eigentliche  
Skript war dann nicht viel mehr als eine Fingerübung.

Das nachfolgende Skript verarbeitet die Daten der im aktuellen Verzeichnis  
vorgefundenen Dateien mit der Erweiterung "xml" unter der Voraussetzung,  
dass die Daten das gleiche Format haben wie vorher (und gibt zusätzlich  
den Namen der gerade zu verarbeitenden Datei aus):

#!/usr/bin/env ruby

require 'rexml/document'
require 'net/http'

Dir["./*.xml"].each do |filename|
   puts filename
   File.open(filename, "r") do |f|
     REXML::Document.new(f).elements.each('weekOverview/programs/day') do  
|day|
       dayLabel = day.attributes['dayLabel']
       date     = day.attributes['date']
       day.elements.each('program') do |prog|
         puts <<EOF
#{date} #{prog.elements['startTime'].text}  
(#{prog.elements['duration'].text})
#{prog.elements['titel'].text}: #{prog.elements['episode_name'].text}  
(#{prog.elements['episode_number'].text})

EOF
       end
     end
   end
end

Hoffentlich habe ich nun die Herangehensweise ausreichend illustriert.

Josef 'Jupp' Schugt
-- 
Blog: http://penpen.goodaddress.eu/
PGP key (id 6CC6574F): http://wwwkeys.de.pgp.net/
Jabber - http://www.jabber.org/ - contact information on request