DOM PHP (Opgelost)
Martnt - 02/02/2011 17:54 (laatste wijziging 03/02/2011 10:54)
Nieuw lid
Okee ik zal het zo simpel mogelijk allemaal vertellen wat ik graag zou willen. Ik wil graag enkele gegevens uit mijn rooster halen zodat ik mijn eigen mobile rooster heb. Ik wil deze gegevens uit de rooster site van mijn school halen en dus opslaan in mysql.
Het laatste gedeelte heb ik niet zoveel moeite mee, het opslaan in de database. Alleen het afhalen van de website, daar weet ik helemaal niets van. Ik heb het al geprobeerd met regular expressions maar ik heb meerdere keren gelezen dat dit veel te inefficient is en dat DOM (een extensie van PHP) hier veel makkelijker voor is aangezien ik het uit HTML moet halen.
Nou ziet de html van de rooster site er zo uit:
http://www.plaatscode.be/140605 /
Wat ik uiteindelijk wil bereiken is dat de gegevens zo in een array komen te staan:
Dinsdag 18-januari-2011 08:30 - 16:00 Studieloopbaanbegeleiding Lokaalnr (<td class="cellokaal"></td>)
08:30 - 16:00 Studieloopbaanbegeleiding Lokaalnr (<td class="cellokaal"></td>)
Woensdag 19-januari-2011 08:30 - 16:00 Studieloopbaanbegeleiding Lokaalnr (<td class="cellokaal"></td>)
08:30 - 16:00 Studieloopbaanbegeleiding Lokaalnr (<td class="cellokaal"></td>)
Dinsdag 18 - januari- 2011 08 : 30 - 16 : 00 Studieloopbaanbegeleiding Lokaalnr ( < td class = "cellokaal" ></ td> )
08 : 30 - 16 : 00 Studieloopbaanbegeleiding Lokaalnr ( < td class = "cellokaal" ></ td> )
Woensdag 19 - januari- 2011 08 : 30 - 16 : 00 Studieloopbaanbegeleiding Lokaalnr ( < td class = "cellokaal" ></ td> )
08 : 30 - 16 : 00 Studieloopbaanbegeleiding Lokaalnr ( < td class = "cellokaal" ></ td> )
En nu is het misschien simpel om te vragen of iemand mij de code kan voorkauwen maar dit is eigenlijk wat mij het meest zal helpen. Ik heb meerdere sites doorgelezen, uitgeprobeerd en ondervonden dat het gewoon niet lukt.
Kan iemand mij helpen om dit voor elkaar te krijgen?
Je zou mij er een heel groot plezier mee doen!!!!
Alvast hartelijk bedankt,
Martijn
--------------------------
EDIT:
--------------------------
Ik ben een stuk opgeschoten. Wat ik nu heb aan code is dit, ik maak gebruik van simple html dom parser:
<?php
include_once 'simple_html_dom.php';
$html = file_get_html ( 'http://roosters.saxion.nl/index.php?klas=DTP2VG&intraprof=AMA+TP+vt+D&lang=NL&weekoffset=&printversie' );
$html = preg_replace ( '/<tr class="tabeltitel">/', '</div><div class="lesdagen"></table><table class="lesinhoud"><tr class="tabeltitel">', $html );
$html = str_get_html ( $html );
$sub = 0;
foreach ( $html->find('div.lesdagen') as $lessen)
{
$item['lesdag'] = $lessen->find( 'td.celtitel', 0 )->plaintext;
foreach ( $lessen->find('table.lesinhoud') as $inhoud)
{
$item[$sub]['lestijd'] = $inhoud->find( 'td.celtijd', 0 )->plaintext;
$item[$sub]['les'] = $inhoud->find( 'div.floatLeft', 0 )->plaintext;
$item[$sub]['lokaal'] = $inhoud->find( 'td.cellokaal', 0 )->plaintext;
$sub ++;
}
$lesdag[] = $item;
}
print_r ( $lesdag );
?>
<?php
include_once 'simple_html_dom.php' ;
$html = file_get_html ( 'http://roosters.saxion.nl/index.php?klas=DTP2VG&intraprof=AMA+TP+vt+D&lang=NL&weekoffset=&printversie' ) ;
$html = preg_replace ( '/<tr class="tabeltitel">/' , '</div><div class="lesdagen"></table><table class="lesinhoud"><tr class="tabeltitel">' , $html ) ; $html = str_get_html ( $html ) ;
$sub = 0 ;
foreach ( $html -> find ( 'div.lesdagen' ) as $lessen )
{
$item [ 'lesdag' ] = $lessen -> find ( 'td.celtitel' , 0 ) -> plaintext ;
foreach ( $lessen -> find ( 'table.lesinhoud' ) as $inhoud )
{
$item [ $sub ] [ 'lestijd' ] = $inhoud -> find ( 'td.celtijd' , 0 ) -> plaintext ;
$item [ $sub ] [ 'les' ] = $inhoud -> find ( 'div.floatLeft' , 0 ) -> plaintext ;
$item [ $sub ] [ 'lokaal' ] = $inhoud -> find ( 'td.cellokaal' , 0 ) -> plaintext ;
$sub ++;
}
$lesdag [ ] = $item ;
}
?>
Nu heb ik alleen het volgende probleem. De array die wordt gemaakt bevat allemaal dubbele resultaten (van de voorgaande dagen) en gaat niet verder dan 1 match, hij gaat dan meteen naar de volgende dag ipv meerdere lessen te vinden. Zie:
Array
(
[0] => Array
(
[lesdag] => Maandag 31-januari-2011
[0] => Array
(
[lestijd] => 13:30 - 15:00
[les] => Preventie 2a
[lokaal] => C061
)
)
[1] => Array
(
[lesdag] => Dinsdag 01-februari-2011
[0] => Array
(
[lestijd] => 13:30 - 15:00
[les] => Preventie 2a
[lokaal] => C061
)
[1] => Array
(
[lestijd] => 12:00 - 12:45
[les] => Leer- en gedragsproblemen 1
[lokaal] => C076
)
)
[2] => Array
(
[lesdag] => Woensdag 02-februari-2011
[0] => Array
(
[lestijd] => 13:30 - 15:00
[les] => Preventie 2a
[lokaal] => C061
)
[1] => Array
(
[lestijd] => 12:00 - 12:45
[les] => Leer- en gedragsproblemen 1
[lokaal] => C076
)
[2] => Array
(
[lestijd] => 10:30 - 12:00
[les] => Klinische psychologie 2c: psychopathologie II
[lokaal] => C061
)
)
[3] => Array
(
[lesdag] => Donderdag 03-februari-2011
[0] => Array
(
[lestijd] => 13:30 - 15:00
[les] => Preventie 2a
[lokaal] => C061
)
[1] => Array
(
[lestijd] => 12:00 - 12:45
[les] => Leer- en gedragsproblemen 1
[lokaal] => C076
)
[2] => Array
(
[lestijd] => 10:30 - 12:00
[les] => Klinische psychologie 2c: psychopathologie II
[lokaal] => C061
)
[3] => Array
(
[lestijd] => 13:30 - 15:00
[les] => Klinische psychologie 2c: psychopathologie II
[lokaal] => T114
)
)
)
(
(
[ lesdag] => Maandag 31 - januari- 2011
(
[ lestijd] => 13 : 30 - 15 : 00
[ les] => Preventie 2a
[ lokaal] => C061
)
)
(
[ lesdag] => Dinsdag 01 - februari- 2011
(
[ lestijd] => 13 : 30 - 15 : 00
[ les] => Preventie 2a
[ lokaal] => C061
)
(
[ lestijd] => 12 : 00 - 12 : 45
[ les] => Leer- en gedragsproblemen 1
[ lokaal] => C076
)
)
(
[ lesdag] => Woensdag 02 - februari- 2011
(
[ lestijd] => 13 : 30 - 15 : 00
[ les] => Preventie 2a
[ lokaal] => C061
)
(
[ lestijd] => 12 : 00 - 12 : 45
[ les] => Leer- en gedragsproblemen 1
[ lokaal] => C076
)
(
[ lestijd] => 10 : 30 - 12 : 00
[ les] => Klinische psychologie 2c: psychopathologie II
[ lokaal] => C061
)
)
(
[ lesdag] => Donderdag 03 - februari- 2011
(
[ lestijd] => 13 : 30 - 15 : 00
[ les] => Preventie 2a
[ lokaal] => C061
)
(
[ lestijd] => 12 : 00 - 12 : 45
[ les] => Leer- en gedragsproblemen 1
[ lokaal] => C076
)
(
[ lestijd] => 10 : 30 - 12 : 00
[ les] => Klinische psychologie 2c: psychopathologie II
[ lokaal] => C061
)
(
[ lestijd] => 13 : 30 - 15 : 00
[ les] => Klinische psychologie 2c: psychopathologie II
[ lokaal] => T114
)
)
)
Kan iemand mij hiermee verder helpen??
12 antwoorden
Gesponsorde links
Beirensg - 03/02/2011 11:36
HTML beginner
Om te beginnen ga je de $sub moeten resetten voor elke lesdag.
En ik denk dat er nog een probleem is met je preg_replace ik zie wat je wil doen, maar ik ben niet zeker of het er goed uitkomt. Kan je hiervan eens de code plaatsen?
Martnt - 03/02/2011 16:16
Nieuw lid
Bedankt voor jullie reacties!! Het is bijna gelukt. Ik heb de array aangemaakt zoals je zei (dom dat ik daar niet aan had gedacht) en de resultaten worden nu goed bij de dag neergezet!!
Nu blijft er alleen nog 1 probleem over, en dat is dat er maar 1 les bij alle dagen wordt gegeven. En het probleem ligt hier:
$lesrooster[$index][$sub]['lestijd'] = $inhoud->find( 'td.celtijd', 0 )->plaintext;
$lesrooster [ $index ] [ $sub ] [ 'lestijd' ] = $inhoud -> find ( 'td.celtijd' , 0 ) -> plaintext ;
Als ik namelijk de 0 verander in een 1, dan geeft hij het tweede resultaat weer enzovoorts. Door die 0 geef hij dus alleen het eerste resultaat. Maar als ik die 0 weg haal krijg ik deze foutmelding:
Notice: Trying to get property of non-object in D:\Documenten\USBWebserver\root\test.php on line 20
Wat ik dus moet doen is dus ervoor zorgen dat ik alle resultaten terughaal. Maar hoe weet ik nog niet, ik zal wel even de documentatie doorkijken. Als iemand hier nog ideeën heeft hoor ik het graag!!
@Beirensg Hetgeen wat ik met de preg_replace heb gedaan is wel goed. Dit heb ik even gedaan omdat de code van de rooster site niet valid is en met dit hulpmiddeltje kan ik toch makkelijk DOM gebruiken
Beirensg - 03/02/2011 16:27 (laatste wijziging 03/02/2011 16:57)
HTML beginner
$inhoud->find( 'td.celtijd', 0 )
toont enkel de eerste cel met class celtijd. Als je de 0 weglaat zal je alle cellen in een array plaatsen, volgens mij kan hierop geen plaintext los laten. (vandaar de error).
Misschien moet je volgende eens proberen:
$i=0;
while ( is_null($inhoud->find( 'td.celtijd',$i))==false){
//fill in array voor lestijd,... met $i als variabele.
$i++;
}
$i = 0 ;
while ( is_null ( $inhoud -> find ( 'td.celtijd' , $i ) ) == false ) { //fill in array voor lestijd,... met $i als variabele.
$i ++;
}
Zodoende test je altijd of er een les bestaat, indien niet zal de lus ophouden (find geeft dan Null weer).
ArieMedia - 03/02/2011 16:36 (laatste wijziging 03/02/2011 16:38)
PHP ver gevorderde
ik neem aan dat $inhoud->find( 'td.celtijd', 0 ) een boolean terug geeft (true of false)
Mits er niet een manier is om erachter te komen hoeveel lessen je hebt, stel ik voor om ook hier gewoon een lus van te maken
$i=0;
while($inhoud->find('td.celtijd', $i) == true) {
// doe iets
$i++;
}
$i = 0 ;
while ( $inhoud -> find ( 'td.celtijd' , $i ) == true ) {
// doe iets
$i ++;
}
Zou dan moeten werken
Edit: Wist niet dat ik al 9 minuten iets anders deed , maar zoals je ziet denkt bovenstaand persoon er hetzelfde over
Martnt - 03/02/2011 16:40
Nieuw lid
Als ik het gebruik zoals jullie zeggen dan krijg ik alleen het laatste resultaat in de array en dus nog steeds 1 resultaat. Dit is de code die ik nu gebruik en de output:
<?php
include_once ( 'simple_html_dom.php' );
$html = file_get_html ( 'http://roosters.saxion.nl/index.php?klas=DTP2VG&intraprof=AMA+TP+vt+D&lang=NL&weekoffset=&printversie' );
$html = preg_replace ( '/<tr class="tabeltitel">/', '</div></table><div class="lesdagen"><table class="lesinhoud"><tr class="tabeltitel">', $html );
$html = str_get_html ( $html );
$lesrooster = array();
$index = $sub = -1;
foreach ( $html->find('div.lesdagen') as $lessen )
{
$index++;
$lesrooster[$index]['lesdag'] = $lessen->find( 'td.celtitel', 0 )->plaintext;
foreach ( $lessen->find( 'table.lesinhoud' ) as $inhoud)
{
$sub++;
$i = 0;
while($inhoud->find('td.celtijd', $i) == true)
{
$lesrooster[$index][$sub]['lestijd'] = $inhoud->find( 'td.celtijd', $i )->plaintext;
$lesrooster[$index][$sub]['les'] = $inhoud->find( 'div.floatLeft', $i )->plaintext;
$lesrooster[$index][$sub]['lokaal'] = $inhoud->find( 'td.cellokaal', $i )->plaintext;
$i++;
}
}
}
print_r ( $lesrooster );
?>
<?php
include_once ( 'simple_html_dom.php' ) ;
$html = file_get_html ( 'http://roosters.saxion.nl/index.php?klas=DTP2VG&intraprof=AMA+TP+vt+D&lang=NL&weekoffset=&printversie' ) ;
$html = preg_replace ( '/<tr class="tabeltitel">/' , '</div></table><div class="lesdagen"><table class="lesinhoud"><tr class="tabeltitel">' , $html ) ; $html = str_get_html ( $html ) ;
$index = $sub = - 1 ;
foreach ( $html -> find ( 'div.lesdagen' ) as $lessen )
{
$index ++;
$lesrooster [ $index ] [ 'lesdag' ] = $lessen -> find ( 'td.celtitel' , 0 ) -> plaintext ;
foreach ( $lessen -> find ( 'table.lesinhoud' ) as $inhoud )
{
$sub ++;
$i = 0 ;
while ( $inhoud -> find ( 'td.celtijd' , $i ) == true )
{
$lesrooster [ $index ] [ $sub ] [ 'lestijd' ] = $inhoud -> find ( 'td.celtijd' , $i ) -> plaintext ;
$lesrooster [ $index ] [ $sub ] [ 'les' ] = $inhoud -> find ( 'div.floatLeft' , $i ) -> plaintext ;
$lesrooster [ $index ] [ $sub ] [ 'lokaal' ] = $inhoud -> find ( 'td.cellokaal' , $i ) -> plaintext ;
$i ++;
}
}
}
?>
Array
(
[0] => Array
(
[lesdag] => Maandag 31-januari-2011
[0] => Array
(
[lestijd] => 15:15 - 16:45
[les] => Coaching, counseling en training 2b
[lokaal] => A416B426
)
)
[1] => Array
(
[lesdag] => Dinsdag 01-februari-2011
[1] => Array
(
[lestijd] => 13:30 - 15:00
[les] => Preventie 2a
[lokaal] => B322
)
)
[2] => Array
(
[lesdag] => Woensdag 02-februari-2011
[2] => Array
(
[lestijd] => 10:30 - 12:00
[les] => Klinische psychologie 2c: psychopathologie II
[lokaal] => C061
)
)
[3] => Array
(
[lesdag] => Donderdag 03-februari-2011
[3] => Array
(
[lestijd] => 15:15 - 16:45
[les] => Diagnostisch onderzoek 2c: onderwijs
[lokaal] => T114
)
)
)
(
(
[ lesdag] => Maandag 31 - januari- 2011
(
[ lestijd] => 15 : 15 - 16 : 45
[ les] => Coaching, counseling en training 2b
[ lokaal] => A416B426
)
)
(
[ lesdag] => Dinsdag 01 - februari- 2011
(
[ lestijd] => 13 : 30 - 15 : 00
[ les] => Preventie 2a
[ lokaal] => B322
)
)
(
[ lesdag] => Woensdag 02 - februari- 2011
(
[ lestijd] => 10 : 30 - 12 : 00
[ les] => Klinische psychologie 2c: psychopathologie II
[ lokaal] => C061
)
)
(
[ lesdag] => Donderdag 03 - februari- 2011
(
[ lestijd] => 15 : 15 - 16 : 45
[ les] => Diagnostisch onderzoek 2c: onderwijs
[ lokaal] => T114
)
)
)
Beirensg - 03/02/2011 16:41 (laatste wijziging 03/02/2011 16:43)
HTML beginner
@ArieMedia, klopt niet helemaal:
find geeft Null terug indien het element niet gevonden is, of het element zelf.
Maar ik zie dat je exact hetzelfde idee had als mij. Hoe zegt men dat:
Citaat:
Great Minds think alike
Edit:
Ik zou de code toch proberen met de IsNull-variant
Bedankt door: Martnt
Martnt - 03/02/2011 16:45 (laatste wijziging 03/02/2011 16:54)
Nieuw lid
Met de IsNull veriant werkt hij niet. Dan geeft hjj helemaal niets meer...
En ik heb het helemaal werkent!! Ik heb een hele domme fout gemaakt door $sub++; niet in de while te zetten. Dat werkt nu toch...
Edit: De IsNull variant werkt, in plaats van != false moet het zijn == false ;) Het werkt helemaal nu. Bedankt!!!
ArieMedia - 03/02/2011 17:18
PHP ver gevorderde
Probeer deze code maar eens uit AUB, veel overzichtelijker.
<?php
include_once ( 'simple_html_dom.php' );
$html = file_get_html ( 'http://roosters.saxion.nl/index.php?klas=DTP2VG&intraprof=AMA+TP+vt+D&lang=NL&weekoffset=&printversie' );
$html = preg_replace ( '/<tr class="tabeltitel">/', '</div></table><div class="lesdagen"><table class="lesinhoud"><tr class="tabeltitel">', $html );
$html = str_get_html ( $html );
$lesrooster = array();
$i_Dag = 0;
foreach ( $html->find('div.lesdagen') as $lessen ) {
foreach ( $lessen->find( 'table.lesinhoud' ) as $inhoud) {
$a_Dag[$i_Dag]['dag'] = $inhoud->find('td.celtitel',0)->plaintext;
$i =0;
echo '<hr>'.$inhoud.'</hr>';
while($inhoud->find('td.celtijd', $i) == true) {
$a_Dag[$i_Dag][] = array(
'lestijd' => @$inhoud->find('td.celtijd',$i)->plaintext,
'vak' => @$inhoud->find('div.floatLeft', $i)->plaintext,
'lokaal' => @$inhoud->find('td.cellokaaal', $i)->plaintext
);
$i++;
}
$i_Dag ++;
//echo $inhoud; exit();
}
}
?>
echo '<pre>'.print_r($a_Dag,1).'</pre>';
<?php
include_once ( 'simple_html_dom.php' ) ;
$html = file_get_html ( 'http://roosters.saxion.nl/index.php?klas=DTP2VG&intraprof=AMA+TP+vt+D&lang=NL&weekoffset=&printversie' ) ;
$html = preg_replace ( '/<tr class="tabeltitel">/' , '</div></table><div class="lesdagen"><table class="lesinhoud"><tr class="tabeltitel">' , $html ) ; $html = str_get_html ( $html ) ;
$i_Dag = 0 ;
foreach ( $html -> find ( 'div.lesdagen' ) as $lessen ) {
foreach ( $lessen -> find ( 'table.lesinhoud' ) as $inhoud ) {
$a_Dag [ $i_Dag ] [ 'dag' ] = $inhoud -> find ( 'td.celtitel' , 0 ) -> plaintext ;
$i = 0 ;
echo '<hr>' . $inhoud . '</hr>' ; while ( $inhoud -> find ( 'td.celtijd' , $i ) == true ) {
$a_Dag [ $i_Dag ] [ ] = array ( 'lestijd' => @ $inhoud -> find ( 'td.celtijd' , $i ) -> plaintext ,
'vak' => @ $inhoud -> find ( 'div.floatLeft' , $i ) -> plaintext ,
'lokaal' => @ $inhoud -> find ( 'td.cellokaaal' , $i ) -> plaintext
) ;
$i ++;
}
$i_Dag ++;
//echo $inhoud; exit();
}
}
?>
echo '<pre>'.print_r($a_Dag,1).'</pre>';
Martnt - 03/02/2011 18:32
Nieuw lid
Hartstikke bedankt voor jullie hulp!!
Gesponsorde links
Je moet ingelogd zijn om een reactie te kunnen posten.