[PHP] Werte aus HTML-Tabelle in Array

Lares0

Cadet 1st Year
Dabei seit
Juli 2006
Beiträge
12
Einen wunderschönen guten Abend.

Ich möchte aus einer fremden Webseite (Stundenausfallplan unserer Schule) Daten aus einer Tabelle in arrays laden.

die fremde webseite ist diese hier
http://admin.supplierplan.at/cgi-bin/supp.pl?schule=407036&user=schueler&pwd=schueler&find=6b

ich hab schon ein script gefunden mit dem ich mir den gesamten Quelltext schnappen kann, aber wie gehts weiter? Wie kann ich nun die Daten aus den einzelnen Zellen extrahieren und sie in verschiedene Arrays packen?

Code für Quelltext
PHP:
$host = "http://admin.supplierplan.at/cgi-bin/supp.pl?schule=407036&user=schueler&pwd=schueler&find=6b";
$filestring = file_get_contents($host);
$startpos = 0;
while($pos = strpos($filestring, "<table class=\"ListBox\" border=\"0\" cellpadding=\"2\" cellspacing=\"0\">", $startpos))
{
    $string = substr($filestring, $pos, strpos($filestring, "<!-- Supplierungen Ende -->", $pos + 1) - $pos);
    $startpos = $pos + 1;
}

Danke für eure Hilfe!
 
AW: PHP: Werte aus Tabelle in array

Mit regulären Ausdrücken könnte das funktionieren. Ist aber generell ein sehr schwieriges Unterfangen :)
 
AW: PHP: Werte aus Tabelle in array

Solange die Seite unverändert bleibt und sich nur die Daten ändern, kannst du einfach alles bis zum ersten Tabelleneintrag entfernen (hat ja statische Länge). Danach einfach den Quelltext durchgehen und die Tabellen-Einträge rausschneiden. Nach dem letzten Tabellen-Eintrag den Rest wegwerfen.

Das geht alles ganz einfach mit String-Operationen.

Wenn das ganze auch noch später funktionieren soll, wenn die Seite verändert wird, muss man das schon bei der Webseiten-Programmierung berücksichtigen durch entsprechende Markierungen der Daten (zB durch Kommentare).
 
AW: PHP: Werte aus Tabelle in array

Tja, eben bei dem "Tabellen-Einträge rausschneiden" könnte ich hilfe gebrauchen, da bei mir (als ich das versucht hab) einen haufen "pseudo"-leere arrays (leerzeichen und absätze) drin gewesen sind, und ich jetzt wieder genau so weit bin wie vorher ;)
 
AW: PHP: Werte aus Tabelle in array

Wie gesagt den Anfang vom Quelltext wegschneiden, dann bist du beim ersten Eintrag, der sieht so aus:
HTML:
<tr bgcolor="#C6D6D6">
 <td align="right" class="topline"><font class="normtxt" size="2" face="Arial"><b>Mo, 04.12.2006</b></font></td>
<td align="center" class="topline"><font class="normtxt" size="2" face="Arial">6B</font></td>

<td align="center" class="topline"><font class="normtxt" size="2" face="Arial">6</font></td>
<td align="center" class="topline"><font class="normtxt" size="2" face="Arial">Cs</font></td>
               <td align="center" class="topline"><font class="normtxt" size="2" face="Arial">F2</font></td>
<td align="center" class="rightline topline"><font class="normtxt" size="2" face="Arial">R6B</font></td>
               <td align="center" class="topline"><font class="normtxt" size="2" face="Arial">WB</font></td>
<td align="center" class="topline"><font class="normtxt" size="2" face="Arial">&nbsp;</font></td>
               <td class="topline"><font class="normtxt" size="2" face="Arial">&nbsp;</font></td>
</tr>

Jetzt gehst du in einer Schleife die folgenden Schritte solange durch bis kein weiterer Tabellen-Eintrag mehr kommt (das heißt kein Code mehr folgt, der dem obigen Schema entspricht):

1) wegschneiden:
HTML:
<tr bgcolor="#C6D6D6">
 <td align="right" class="topline"><font class="normtxt" size="2" face="Arial"><b>

2) alles bis exklusive </b> einlesen und speichern

3) wegschneiden:
HTML:
</b></font></td>
<td align="center" class="topline"><font class="normtxt" size="2" face="Arial">

4) alles bis exklusive </font> einlesen und speichern

5) usw. usf.

n-3) wegschneiden:
HTML:
</font></td>
               <td class="topline"><font class="normtxt" size="2" face="Arial">

n-2) alles bis exklusive </font> einlesen und speichern

n-1) wegschneiden:
HTML:
</font></td>
</tr>

n) falls Code mit
HTML:
<tr bgcolor="#C6D6D6">
weitergeht, zu Schritt 1 gehen
 
AW: PHP: Werte aus Tabelle in array

Genau @Loopo
Das müsste mit "eregi", "explode" usw. recht gut zu bewerkstelligen gehen. Reguläre Ausdrücke sind da nicht zwangsläufig nötig. Habe ja selber schon durch dieses recht einfache Prinzip sehr umfangreichen Contenklau in Echtzeit betrieben. Aber psst, mehr wird nicht erzählt. ;)
 
AW: PHP: Werte aus Tabelle in array

@ loopo: sry ich beschäftige mich noch nicht so lang mit php (hab mir auch das, was ich kann selber beibringen müssen ;) )

ich kapier zwar wie du es meinst, aber ich kann es irgendwie nicht richtig reallisieren.
z.b. dass mehrere male nach dem vorkommen gesucht wird ohne dass wieder von vorne begonnen wird, etc ....


Bitte um Hilfe
 
AW: PHP: Werte aus Tabelle in array

Reguläre Ausdrücke sind nicht gerade die schnellsten und für diesen Fall ja auch unnötig. Geht alles einfach mit den Funktionen strpos() und substr().

Also Beispiel du hast den Quelltext der Seite in die Variable $code geladen, dann sieht das ca. wie folgt aus (nicht getestet!):

PHP:
<?php
// Anfang wegschneiden
$marker = '<!-- Supplierungen Begin -->';
$code = cut($code, $marker);

$cnt = 0;
while(true)
{
	// zum Zeilen-Beginn gehen
	$code = cut($code, '<tr bgcolor="#C6D6D6">');
	
	// zum ersten Eintrag gehen und Eintrag kopieren - DATUM
	$code = cut($code, '<b>');
	$datum[$cnt] = copy($code, '</b>');
	
	// zum nächsten Eintrag gehen und Eintrag kopieren - KLASSE
	$code = cut($code, 'face="Arial">');
	$klasse[$cnt] = copy($code, '</font>');
	
	// STUNDE
	$code = cut($code, 'face="Arial">');
	$stunde[$cnt] = copy($code, '</font>');
	
	// VERTRETUNG
	$code = cut($code, 'face="Arial">');
	$vertretung[$cnt] = copy($code, '</font>');
	
	// FACH
	$code = cut($code, 'face="Arial">');
	$fach[$cnt] = copy($code, '</font>');
	
	// RAUM
	$code = cut($code, 'face="Arial">');
	$raum[$cnt] = copy($code, '</font>');
	
	// STATT
	$code = cut($code, 'face="Arial">');
	$statt[$cnt] = copy($code, '</font>');
	
	// STATT2
	$code = cut($code, 'face="Arial">');
	$statt2[$cnt] = copy($code, '</font>');
	
	// BEMERKUNG
	$code = cut($code, 'face="Arial">');
	$bemerkung[$cnt] = copy($code, '</font>');
	
	// Rest der Zeile entfernen
	$code = cut($code, '</tr>');
	$code = trim($code);
	
	// falls Tabelle zu Ende, Schleife verlassen
	if(strpos($code, '</table>') <= 1)
		break;
	
	$cnt++;
}

// Anfang bis inkl. $marker von $content wegschneiden und Rest zurückliefern
function cut($content, $marker)
{
	return substr($content, strpos($content, $marker) + strlen($marker));
}

// Anfang bis exkl. $marker von $content zurückliefern
function copy($content, $marker)
{
	return substr($content, 0, strpos($content, $marker));
}
?>

Sollte am Aufbau der Homepage etwas verändert werden, kann dies aber zur Folge haben, dass das Script nicht mehr funktioniert und angepasst werden muss.
 
Zuletzt bearbeitet:
AW: PHP: Werte aus Tabelle in array

PHP:
// Anfang bis exkl. $marker von $content zurückliefern
function makecopy($content, $marker)
{
    return substr($content, 0, strpos($content, $marker));
}
 
AW: PHP: Werte aus Tabelle in array

DANKE! funktioniert nun tadellos!
 
AW: PHP: Werte aus Tabelle in array

sry wegen doppelpost, aber ich hab noch ein kleines fehlerteufelchen gefunden

wenn mehrere supplierungen an einem tag sind wird von supplierplan.at das datum nur EINMAL (sprich bei der 1. supplierung) angezeigt; d.h. bei mehreren supplierungen wird nur die 1. in die arrays geladen.

is jetzt blöd weil ab morgen (6.12.) diese doppelte supplierung weg ist (d.h. kein beispiel mehr vorhanden)
 
Zurück
Top