login  Naam:   Wachtwoord: 
Registreer je!
 Forum

DOM PHP (Opgelost)

Offline Martnt - 02/02/2011 17:54 (laatste wijziging 03/02/2011 10:54)
Avatar van MartntNieuw 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:
  1. Dinsdag 18-januari-2011 08:30 - 16:00 Studieloopbaanbegeleiding Lokaalnr (<td class="cellokaal"></td>)
  2. 08:30 - 16:00 Studieloopbaanbegeleiding Lokaalnr (<td class="cellokaal"></td>)
  3. Woensdag 19-januari-2011 08:30 - 16:00 Studieloopbaanbegeleiding Lokaalnr (<td class="cellokaal"></td>)
  4. 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:

  1. <?php
  2.  
  3. include_once 'simple_html_dom.php';
  4.  
  5. $html = file_get_html ( 'http://roosters.saxion.nl/index.php?klas=DTP2VG&intraprof=AMA+TP+vt+D&lang=NL&weekoffset=&printversie' );
  6. $html = preg_replace ( '/<tr class="tabeltitel">/', '</div><div class="lesdagen"></table><table class="lesinhoud"><tr class="tabeltitel">', $html );
  7. $html = str_get_html ( $html );
  8.  
  9. $sub = 0;
  10.  
  11. foreach ( $html->find('div.lesdagen') as $lessen)
  12. {
  13. $item['lesdag'] = $lessen->find( 'td.celtitel', 0 )->plaintext;
  14.  
  15. foreach ( $lessen->find('table.lesinhoud') as $inhoud)
  16. {
  17. $item[$sub]['lestijd'] = $inhoud->find( 'td.celtijd', 0 )->plaintext;
  18. $item[$sub]['les'] = $inhoud->find( 'div.floatLeft', 0 )->plaintext;
  19. $item[$sub]['lokaal'] = $inhoud->find( 'td.cellokaal', 0 )->plaintext;
  20.  
  21. $sub ++;
  22. }
  23.  
  24. $lesdag[] = $item;
  25. }
  26.  
  27. print_r ( $lesdag );
  28.  
  29. ?>


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:

  1. (
  2. [0] => Array
  3. (
  4. [lesdag] => Maandag 31-januari-2011
  5. [0] => Array
  6. (
  7. [lestijd] => 13:30 - 15:00
  8. [les] => Preventie 2a
  9. [lokaal] => C061
  10. )
  11.  
  12. )
  13.  
  14. [1] => Array
  15. (
  16. [lesdag] => Dinsdag 01-februari-2011
  17. [0] => Array
  18. (
  19. [lestijd] => 13:30 - 15:00
  20. [les] => Preventie 2a
  21. [lokaal] => C061
  22. )
  23.  
  24. [1] => Array
  25. (
  26. [lestijd] => 12:00 - 12:45
  27. [les] => Leer- en gedragsproblemen 1
  28. [lokaal] => C076
  29. )
  30.  
  31. )
  32.  
  33. [2] => Array
  34. (
  35. [lesdag] => Woensdag 02-februari-2011
  36. [0] => Array
  37. (
  38. [lestijd] => 13:30 - 15:00
  39. [les] => Preventie 2a
  40. [lokaal] => C061
  41. )
  42.  
  43. [1] => Array
  44. (
  45. [lestijd] => 12:00 - 12:45
  46. [les] => Leer- en gedragsproblemen 1
  47. [lokaal] => C076
  48. )
  49.  
  50. [2] => Array
  51. (
  52. [lestijd] => 10:30 - 12:00
  53. [les] => Klinische psychologie 2c: psychopathologie II
  54. [lokaal] => C061
  55. )
  56.  
  57. )
  58.  
  59. [3] => Array
  60. (
  61. [lesdag] => Donderdag 03-februari-2011
  62. [0] => Array
  63. (
  64. [lestijd] => 13:30 - 15:00
  65. [les] => Preventie 2a
  66. [lokaal] => C061
  67. )
  68.  
  69. [1] => Array
  70. (
  71. [lestijd] => 12:00 - 12:45
  72. [les] => Leer- en gedragsproblemen 1
  73. [lokaal] => C076
  74. )
  75.  
  76. [2] => Array
  77. (
  78. [lestijd] => 10:30 - 12:00
  79. [les] => Klinische psychologie 2c: psychopathologie II
  80. [lokaal] => C061
  81. )
  82.  
  83. [3] => Array
  84. (
  85. [lestijd] => 13:30 - 15:00
  86. [les] => Klinische psychologie 2c: psychopathologie II
  87. [lokaal] => T114
  88. )
  89.  
  90. )
  91.  
  92. )


Kan iemand mij hiermee verder helpen??

12 antwoorden

Gesponsorde links
Offline Beirensg - 03/02/2011 11:36
Avatar van Beirensg 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?
Offline ArieMedia - 03/02/2011 13:01
Avatar van ArieMedia Gouden medaille

PHP ver gevorderde
Zet na deze regel:

$lesdag[] = $item;
dit neer:
$item = array();

Jij vult $item namelijk elke keer aan, en daarna ken je hem toe aan $lesdag[].
door $item=array(); eronder te zetten leeg je $item (geforceerd), en zal het dus waarschijnlijk goed gaan.
Bedankt door: Martnt
Offline Martnt - 03/02/2011 16:16
Avatar van Martnt 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:

  1. $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 
Offline Beirensg - 03/02/2011 16:27 (laatste wijziging 03/02/2011 16:57)
Avatar van Beirensg 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:
  1. $i=0;
  2. while ( is_null($inhoud->find( 'td.celtijd',$i))==false){
  3. //fill in array voor lestijd,... met $i als variabele.
  4. $i++;
  5. }


Zodoende test je altijd of er een les bestaat, indien niet zal de lus ophouden (find geeft dan Null weer).

Offline ArieMedia - 03/02/2011 16:36 (laatste wijziging 03/02/2011 16:38)
Avatar van ArieMedia Gouden medaille

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
  1. $i=0;
  2. while($inhoud->find('td.celtijd', $i) == true) {
  3. // doe iets
  4. $i++;
  5. }


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 
Offline Martnt - 03/02/2011 16:40
Avatar van Martnt 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:

  1. <?php
  2.  
  3. include_once ( 'simple_html_dom.php' );
  4.  
  5. $html = file_get_html ( 'http://roosters.saxion.nl/index.php?klas=DTP2VG&intraprof=AMA+TP+vt+D&lang=NL&weekoffset=&printversie' );
  6. $html = preg_replace ( '/<tr class="tabeltitel">/', '</div></table><div class="lesdagen"><table class="lesinhoud"><tr class="tabeltitel">', $html );
  7. $html = str_get_html ( $html );
  8.  
  9. $lesrooster = array();
  10. $index = $sub = -1;
  11.  
  12. foreach ( $html->find('div.lesdagen') as $lessen )
  13. {
  14. $index++;
  15. $lesrooster[$index]['lesdag'] = $lessen->find( 'td.celtitel', 0 )->plaintext;
  16.  
  17. foreach ( $lessen->find( 'table.lesinhoud' ) as $inhoud)
  18. {
  19. $sub++;
  20. $i = 0;
  21.  
  22. while($inhoud->find('td.celtijd', $i) == true)
  23. {
  24. $lesrooster[$index][$sub]['lestijd'] = $inhoud->find( 'td.celtijd', $i )->plaintext;
  25. $lesrooster[$index][$sub]['les'] = $inhoud->find( 'div.floatLeft', $i )->plaintext;
  26. $lesrooster[$index][$sub]['lokaal'] = $inhoud->find( 'td.cellokaal', $i )->plaintext;
  27. $i++;
  28. }
  29. }
  30. }
  31.  
  32. print_r ( $lesrooster );
  33.  
  34. ?>


  1. (
  2. [0] => Array
  3. (
  4. [lesdag] => Maandag 31-januari-2011
  5. [0] => Array
  6. (
  7. [lestijd] => 15:15 - 16:45
  8. [les] => Coaching, counseling en training 2b
  9. [lokaal] => A416B426
  10. )
  11.  
  12. )
  13.  
  14. [1] => Array
  15. (
  16. [lesdag] => Dinsdag 01-februari-2011
  17. [1] => Array
  18. (
  19. [lestijd] => 13:30 - 15:00
  20. [les] => Preventie 2a
  21. [lokaal] => B322
  22. )
  23.  
  24. )
  25.  
  26. [2] => Array
  27. (
  28. [lesdag] => Woensdag 02-februari-2011
  29. [2] => Array
  30. (
  31. [lestijd] => 10:30 - 12:00
  32. [les] => Klinische psychologie 2c: psychopathologie II
  33. [lokaal] => C061
  34. )
  35.  
  36. )
  37.  
  38. [3] => Array
  39. (
  40. [lesdag] => Donderdag 03-februari-2011
  41. [3] => Array
  42. (
  43. [lestijd] => 15:15 - 16:45
  44. [les] => Diagnostisch onderzoek 2c: onderwijs
  45. [lokaal] => T114
  46. )
  47.  
  48. )
  49.  
  50. )
Offline Beirensg - 03/02/2011 16:41 (laatste wijziging 03/02/2011 16:43)
Avatar van Beirensg 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
Offline Martnt - 03/02/2011 16:45 (laatste wijziging 03/02/2011 16:54)
Avatar van Martnt 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!!!
Offline ArieMedia - 03/02/2011 16:46 (laatste wijziging 03/02/2011 16:48)
Avatar van ArieMedia Gouden medaille

PHP ver gevorderde
Edit: ik zal even naar je code kijken.. Moet er zelf even mee bezig voordat ik weer een uitspraak doe 
Offline Beirensg - 03/02/2011 16:57
Avatar van Beirensg HTML beginner Ok, stom foutje van mij.  
Offline ArieMedia - 03/02/2011 17:18
Avatar van ArieMedia Gouden medaille

PHP ver gevorderde
Probeer deze code maar eens uit AUB, veel overzichtelijker.

  1. <?php
  2.  
  3. include_once ( 'simple_html_dom.php' );
  4.  
  5. $html = file_get_html ( 'http://roosters.saxion.nl/index.php?klas=DTP2VG&intraprof=AMA+TP+vt+D&lang=NL&weekoffset=&printversie' );
  6. $html = preg_replace ( '/<tr class="tabeltitel">/', '</div></table><div class="lesdagen"><table class="lesinhoud"><tr class="tabeltitel">', $html );
  7. $html = str_get_html ( $html );
  8.  
  9.  
  10. $lesrooster = array();
  11. $i_Dag = 0;
  12. foreach ( $html->find('div.lesdagen') as $lessen ) {
  13. foreach ( $lessen->find( 'table.lesinhoud' ) as $inhoud) {
  14. $a_Dag[$i_Dag]['dag'] = $inhoud->find('td.celtitel',0)->plaintext;
  15. $i =0;
  16. echo '<hr>'.$inhoud.'</hr>';
  17. while($inhoud->find('td.celtijd', $i) == true) {
  18. $a_Dag[$i_Dag][] = array(
  19. 'lestijd' => @$inhoud->find('td.celtijd',$i)->plaintext,
  20. 'vak' => @$inhoud->find('div.floatLeft', $i)->plaintext,
  21. 'lokaal' => @$inhoud->find('td.cellokaaal', $i)->plaintext
  22. );
  23. $i++;
  24. }
  25. $i_Dag ++;
  26. //echo $inhoud; exit();
  27. }
  28. }
  29. ?>
  30. echo '<pre>'.print_r($a_Dag,1).'</pre>';
Offline Martnt - 03/02/2011 18:32
Avatar van Martnt Nieuw lid Hartstikke bedankt voor jullie hulp!!
Gesponsorde links
Je moet ingelogd zijn om een reactie te kunnen posten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.27s