Hi,
Ich hab ein Programm, dass aus unterschiedlichen Webseiten bestimmte Informationen raus filtern und sammeln soll. Das Problem ist, jede dieser Webseiten ist anders aufgebaut. Ich bin also theoretisch gezwungen für jede Webseite einen eigenen Filter zu entwickeln.
In "Spidering Hacks" (Kevin Hemenway & Tara Calishain) wird solch eine Lösung gezeigt. Dort wird für jede neue Seite ein eigener Filter programmiert und wie ein Addon in das Hauptprogramm integriert. Für 3 Webseiten fand ich das akzeptabel, aber bei einer größeren Menge an Webseiten würde diese Lösung viel Arbeit bedeuten. Deswegen hab ich mir folgende Gedanken gemacht:
Stellt euch vor, ich könnte eine Art Konfigurationsdatei (z.B. in XML) schreiben, die dem Programm genau sagt, an welchen Stellen der Webseite es die gewünschten Informationen findet. Beispielsweise die HTML-Tags in denen sich Produktname und Preis befinden.
Ich müsste nicht mehr für jede Seite einen neuen Filter programmieren, sondern nur die Anweisungen in der Konfigurationsdatei ändern. In der Hoffnung, dass das schneller geht ;) Mein Problem ist die Umsetzung. Im Prinzip müsste man dazu einen Parser entwickeln, der XML-Anweisungen in HTML::Treebuilder-Operationen übersetzt.
Dies ist ein Ausschnitt aus den Ergebnissen einer Suchanfrage auf Alternate.de. Da die interessanten Tags nicht alle über signifikante Attribute verfügen, ist es nicht immer einfach sie zu isolieren:
<span class="product"> <span class="pic"
style="background-image: url(/p/80x80/i/Corsair_DIMM_16_GB_DDR3_1600_Quad_Kit@@ieif57t9.png);"></span><span>Corsair
DIMM 16 GB DDR3-1600 Quad-Kit</span><br>
CML16GX3M4X1600C7, Vengeance LP XMP<br>
<strong class="stockStatus1">Auf Lager</strong></span>
Versucht man aus diesem Teil des Codes den Produktnamen zu ermitteln muss man zunächst nach dem span-Tag mit dem class="product" Attribut suchen um dessen Child-Tags, die keinerlei signifikante Attribute haben zu untersuchen. Erkennen müsste der Filter diesen Ausschnitt:
<span>Corsair
DIMM 16 GB DDR3-1600 Quad-Kit</span><br>
CML16GX3M4X1600C7, Vengeance LP XMP<br>
Wie verpackt man einen entsprechenden Filter in eine XML-Datei und wie müsste der Parser aussehen?
Ihr kennt sicher alle das HTML::Treebuilder Modul. Damit kann man ja jede Information finden, egal wie versteckt sie ist. Nur einen Parser zu entwickeln, der (wie auch immer geartete) XML-Anweisungen in Treebuilder-Operationen übersetzt ist viel komplizierter als ich dachte. Erstrecht wenn einem verschachtelte HTML-Tags das Leben schwer machen.
Deswegen meine Frage: Ist mein Ansatz zu kompliziert? Ich wollte eine Vereinfachung, aber jetzt wächst mir diese Vereinfachung über den Kopf. Ich bin nicht fit genug in XML um solch eine Struktur zu entwickeln, wie sie hier nötig wäre. Aber ich finde die Idee ansich gar nicht so verkehrt.
Was meint ihr dazu? Gibt es eventuell schon Module die etwas ähnliches ermöglichen? Ich hab bisher keine gefunden.
Gruß, Nordlicht.
Last edited: 2012-05-08 15:11:18 +0200 (CEST)