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