<div> auslesen und Inhalt verwenden

  • PHP

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von Agita.

    <div> auslesen und Inhalt verwenden

    Hallo,
    ich sitze schon seit Stunden an einem Script, wo ich aber einfach nicht weiterkomme.

    Ich möchte die Wetterwarnungen des DWD auf einem Computer anzeigen (nicht öffentlich).

    Das Auslesen der kompletten Seite (dwd.de/dyn/app/ws/html/reports…rning_de.html#WS_ANCHOR_0) bekomme ich hin, aber weiter komme ich einfach nicht.

    Im Prinzip möchte ich es genau so wiedergeben, wie es bereits auf der Website zu sehen ist. Das Problem ist nur, dass das auf der Seite des DWDs alles zu groß ist.

    Beispiel an einer Warnung.
    Wenn eine Warnung vorliegt möchte ich den Warntext auslesen und in einer Tabelle mit einem farbigen border ausgeben. Die Farbe möchte ich ebenfalls aus einem <div> auslesen.

    Der Aufbau des Quellcodes für eine Warnung sieht wie folgt aus:
    Spoiler anzeigen

    HTML-Quellcode

    1. <div class="app_ws_warning_content_text" style="border-left-color: #FA9600">
    2. <a name="WS_ANCHOR_1"></a><a name="WS_ANCHOR_0"></a>
    3. <div id="ebp_ws_warning_content">
    4. <p>
    5. Amtliche WARNUNG vor STURMBÖEN </p>
    6. <p>
    7. für Region Hannover </p>
    8. <p>
    9. gültig von: Freitag, 06.12.2013 10:04 Uhr </p>
    10. <p>
    11. bis: Freitag, 06.12.2013 18:00 Uhr </p>
    12. <p>
    13. ausgegeben vom Deutschen Wetterdienst </p>
    14. <p>
    15. am: Freitag, 06.12.2013 10:04 Uhr </p>
    16. <p>
    17. Es treten Sturmböen mit Geschwindigkeiten um 80 km/h (22m/s, 44kn, Bft 9) aus nordwestlicher Richtung auf. </p>
    18. <p>
    19. ACHTUNG! Hinweis auf mögliche Gefahren: Es können zum Beispiel einzelne Äste herabstürzen. Achten Sie besonders auf herabfallende Gegenstände. </p>
    20. <p>
    21. DWD / RZ Hamburg </p>
    22. </div>
    23. </div>


    Für eine weitere Warnunung ist der Code gleich aufgebaut:
    Spoiler anzeigen

    HTML-Quellcode

    1. <div class="app_ws_warning_content_text" style="border-left-color: #FA9600">
    2. <a name="WS_ANCHOR_1"></a><a name="WS_ANCHOR_0"></a>
    3. <div id="ebp_ws_warning_content">
    4. <p>
    5. Amtliche WARNUNG vor STURMBÖEN </p>
    6. <p>
    7. für Region Hannover </p>
    8. <p>
    9. gültig von: Freitag, 06.12.2013 10:04 Uhr </p>
    10. <p>
    11. bis: Freitag, 06.12.2013 18:00 Uhr </p>
    12. <p>
    13. ausgegeben vom Deutschen Wetterdienst </p>
    14. <p>
    15. am: Freitag, 06.12.2013 10:04 Uhr </p>
    16. <p>
    17. Es treten Sturmböen mit Geschwindigkeiten um 80 km/h (22m/s, 44kn, Bft 9) aus nordwestlicher Richtung auf. </p>
    18. <p>
    19. ACHTUNG! Hinweis auf mögliche Gefahren: Es können zum Beispiel einzelne Äste herabstürzen. Achten Sie besonders auf herabfallende Gegenstände. </p>
    20. <p>
    21. DWD / RZ Hamburg </p>
    22. </div>
    23. </div>
    24. <div class="app_ws_warning_content_text" style="border-left-color: #FFFF00">
    25. <a name="WS_ANCHOR_4"></a><a name="WS_ANCHOR_0"></a>
    26. <div id="ebp_ws_warning_content">
    27. <p>
    28. Amtliche WARNUNG vor SCHNEEGLÄTTE </p>
    29. <p>
    30. für Region Hannover </p>
    31. <p>
    32. gültig von: Freitag, 06.12.2013 10:36 Uhr </p>
    33. <p>
    34. bis: Freitag, 06.12.2013 18:00 Uhr </p>
    35. <p>
    36. ausgegeben vom Deutschen Wetterdienst </p>
    37. <p>
    38. am: Freitag, 06.12.2013 10:36 Uhr </p>
    39. <p>
    40. Verbreitet muss mit Schneeglätte gerechnet werden. </p>
    41. <p>
    42. DWD / RZ Hamburg </p>
    43. </div>
    44. </div>


    Eine Warnung fängt also immer mit

    HTML-Quellcode

    1. <div class="app_ws_warning_content_text" style="border-left-color:
    an.

    Wie kann ich nun mehrere Warnungen auslesen und die die dazugehörige Farbe bestimmen?

    Ich müsste ja erstmal mit einer Schleife überprüfen, wie oft der Tag

    HTML-Quellcode

    1. <div class="app_ws_warning_content_text" style="border-left-color: #FA9600">

    vorkommt. Aber da ist ja auch schon das Problem, dass der Tag durch die Farbe variiert. Also dürfte ich ja nur

    HTML-Quellcode

    1. <div class="app_ws_warning_content_text" style="border-left-color:

    überprüfen.

    Der Inhalt der von <div id="ebp_ws_warning_content"> soll dann in eine Variable geschrieben werden.
    Z.B. $Warnung1, $Warnung2 und dazu dann seperat z.B. $FarbeWarnung1, $FarbeWarnung2

    Ich hoffe ich hab nicht zu kompliziert beschrieben was ich vorhabe.

    Über Hilfe würde ich mich sehr freuen.

    Ich habs schon einiges über preg_match gelesen aber hat mich irgendwie alles nicht weitergebracht.

    Dieser Beitrag wurde bereits 7 mal editiert, zuletzt von „112marv“ ()

    PHP-Quellcode

    1. <?php
    2. error_reporting(E_ALL);
    3. $html = file_get_contents("blah.txt");
    4. if (!preg_match_all("
    5. /
    6. app_ws_warning_content_text
    7. .*?
    8. border-left-color\:\s*\#(\w{6})
    9. .*?
    10. ebp_ws_warning_content[^\>]+\>(.*?)\<\/div\>
    11. /isx", $html, $matches)) die("asdfghjk");
    12. echo "<pre style='padding:5px;border:1px solid #ccc;'>";
    13. print_r($matches[1]);
    14. echo "</pre>";
    15. echo "<pre style='padding:5px;border:1px solid #ccc;'>";
    16. print_r($matches[2]);
    17. echo "</pre>";


    ick erklär dazu ma bissl das regex muster:

    pattern beginnt

    Quellcode

    1. /


    jetz kommt das div mit "class" und "border"
    regex wartet also auf folgendes:

    Quellcode

    1. app_ws_warning_content_text


    nun überspringen wir die nächstes sachen wie zb " style="

    Quellcode

    1. .*?
    das ? ist hier wichtig, da es von greedy(gierig) in ungreedy(nicht gierig) umschaltet.
    würden wir es weglassen, würde regex regelrecht weiterfressen, wirklich alles überspringen was es findet und erst halt machen bei dder letzten passenden position

    jetz ermitteln wir die farbe

    Quellcode

    1. border-left-color\:\s*\#(\w{6})

    zuerst kommt border-left-color, gefolgt von einem doppelpunkt, mehreren (oder keinem) leerzeichen, einem rautezeichen und zu guter letzt 6 ziffern

    um es nich schwer zu machen überspringen wir wieder einfach alles unnötige, bis wieder was wichtiges kommt

    Quellcode

    1. .*?


    hier kommt das nächst wichtige, die id des divs

    Quellcode

    1. ebp_ws_warning_content


    danach soll er alles restliche des div elements überspringen

    Quellcode

    1. [^\>]+


    und dann kommt das ende des divs

    Quellcode

    1. \>


    alles was in diesem div steht wollen wir ebenfalls haben

    Quellcode

    1. (.*?)


    aber nur so viel bis das div wieder geschlossen is

    Quellcode

    1. \<\/div\>


    nun endet das pattern auch schon

    Quellcode

    1. /isx

    i = igore case (ignoriere unterschied zwichen groß/kleinschreibung)
    s = WICHTIG!!! mit diesem modifier findet der punkt auch zeilenumbrüche, was wir hier ja benötigen
    x = igoriere whitespaces (leerzeiche/zeilenumbrüche) im pattern, benutze ich um meine sachen übersichtlicher zu machen

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Agita“ ()

    Ok schonmal vielen Dank dafür. Wie komme ich jetzt aber alleine an den Farbcode und den Warntext?

    Ich möchte ja die Variablen dann in einer HTML - Ausgabe benutzen. Ich hatte mir vorgestellt, dass ich z.B. die Farbe der ersten Meldung in $Farbe1 speicher, Die Farbe der zweiten Meldung in $Farbe2 und das gleiche mit den Texten. $Text1, $Text2.

    Bsp:
    Spoiler anzeigen

    PHP-Quellcode

    1. <?php
    2. echo "<html>head><title>Wetterwarnungen</title></head><body bgcolor="#d7e2e7" scroll="no"><table border='0' bordercolor=$Farbe1 cellpadding='2' cellspacing='0' width='495' align='center'><tr><td>$Text1</td></tr></table></body></html>";
    3. If
    4. Mehrere Warnungen
    5. mach das gleiche nochmal nur mit $Farbe2 und $Text2
    6. echo "<html>head><title>Wetterwarnungen</title></head><body bgcolor="#d7e2e7" scroll="no"><table border='0' bordercolor=$Farbe2 cellpadding='2' cellspacing='0' width='495' align='center'><tr><td>$Text2</td></tr></table></body></html>";
    7. ?>


    Aktuell schaut die Ausgabe jetzt so aus:

    Spoiler anzeigen
    Array
    (
    [0] => FA9600
    [1] => FFFF00
    )
    Array
    (
    [0] =>

    Amtliche WARNUNG vor STURMBÖEN



    für Kreis Harz - Bergland (Oberharz), Lagen über 1000 Meter



    gültig von: Samstag, 07.12.2013 21:36 Uhr



    bis: Sonntag, 08.12.2013 18:00 Uhr



    ausgegeben vom Deutschen Wetterdienst



    am: Samstag, 07.12.2013 21:36 Uhr



    Es treten oberhalb 1000 m Sturmböen mit Geschwindigkeiten bis 85 km/h (24m/s, 47kn, Bft 9) aus westlicher Richtung auf.



    ACHTUNG! Hinweis auf mögliche Gefahren: Es können zum Beispiel einzelne Äste herabstürzen. Achten Sie besonders auf herabfallende Gegenstände.



    DWD / RZ Leipzig



    [1] =>

    Amtliche WARNUNG vor WINDBÖEN



    für Kreis Harz - Bergland (Oberharz)



    gültig von: Sonntag, 08.12.2013 12:00 Uhr



    bis: Sonntag, 08.12.2013 22:00 Uhr



    ausgegeben vom Deutschen Wetterdienst



    am: Sonntag, 08.12.2013 11:16 Uhr



    Es treten Windböen mit Geschwindigkeiten bis 60 km/h (17m/s, 33kn, Bft 7) aus westlicher Richtung auf. In exponierten Lagen muss mit Sturmböen bis 75 km/h (21m/s, 41kn, Bft 9) gerechnet werden.



    DWD / RZ Leipzig



    )

    Dieser Beitrag wurde bereits 9 mal editiert, zuletzt von „112marv“ ()

    Mit meinem Code hast du doch schon alles parat Oo...

    $matches[1] hat die farben in sich. zb:
    $matches[1][0] = "FFCC00";
    $matches[1][1] = "FF0012";

    $matches[2] besitzt die dazugehörigen Texte. zb:
    $matches[2][0] = "dies ist eine warnung";
    $matches[2][1] = "und dies ist noch ein text";

    Du brauchst also nur durch beide durchzuschleifen...

    PHP-Quellcode

    1. error_reporting(E_ALL);
    2. $html = file_get_contents("blah.txt");
    3. if (!preg_match_all("
    4. /
    5. app_ws_warning_content_text
    6. .*?
    7. border-left-color\:\s*\#(\w{6})
    8. .*?
    9. ebp_ws_warning_content[^\>]+\>(.*?)\<\/div\>
    10. /isx", $html, $matches)) die("asdfghjk");
    11. foreach($matches[1] as $i => $color)
    12. {
    13. echo "
    14. <b>{$color}</b>:<br>
    15. <pre style='padding:5px;border:1px solid #ccc;'>
    16. {$matches[2][$i]}
    17. </pre>";
    18. }


    wenn du nu immer noch nich weißt wie du an die array inhalte rankommst, dann würde ich doch vorschlagen mich mit array bisschen mehr zu beschäftigen
    Oh man gleich fang ich an zu weinen ;( . So was habe ich schon in etlichen Varianten ausprobiert und tagelang gegoogelt und mich ausführlich mit Arrays beschäftigt. Wie man sie schreibt weiß ich jetzt, aber ich habe nichts drüber gefunden, wie man sie einzeln ausgibt. Manchmal denk ich einfach zu kompliziert.

    Vielen Dank. :thumbsup:
    :) nja manchma sieht man den wald vor bäumen nicht :P
    aber gut dass es nu funktioniert. wenn du noch mehr aus der seite auslesen willst, frag einfach.

    ach und das "die("asdfghjk");" wird ausgelöst, wenn keine meldungen vorhanden sind, solltest du, wenn noch nich geschehen, nach deinen belieben abändern ;D
    Eine Frage hätte ich da doch nochmal.
    Ich möchte jetzt die Anzahl der Einträge des Arrays zählen. Nicht ausgeben. Die Anzahl brauche ich für eine if-Anweisung. Funktioniert ja normalerweise so:

    PHP-Quellcode

    1. $a = count ($matches[1]);
    2. echo $a;


    Aber egal wie viele Meldungen vorliegen, es wird immer 3 angezeigt. Warum?

    Zur Überprüfung wie viele wirklich drin stehen, habe ich folgenden Code erstellt:

    PHP-Quellcode

    1. $a = count ($matches[1]);
    2. echo $a;
    3. echo "<p>";
    4. print_r ($matches[1]);


    Ausgabe:

    Quellcode

    1. 3
    2. Array ( [0] => FFFF00 )

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „112marv“ ()

    kann es sein, dass du auf count() überprüfst, bevor du preg_match_all aufrufst ? oder an einer falschen stelle?
    denn so funktioniert das ohne probs:

    PHP-Quellcode

    1. <?php
    2. error_reporting(E_ALL);
    3. $html = file_get_contents("http://www.dwd.de/dyn/app/ws/html/reports/WST_warning_de.html#WS_ANCHOR_0");
    4. if (!preg_match_all("
    5. /
    6. app_ws_warning_content_text
    7. .*?
    8. border-left-color\:\s*\#(\w{6})
    9. .*?
    10. ebp_ws_warning_content[^\>]+\>(.*?)\<\/div\>
    11. /isx", $html, $matches)) die("asdfghjk");
    12. $a = count ($matches[1]);
    13. echo $a;
    14. foreach($matches[1] as $i => $color)
    15. {
    16. echo "
    17. <b>{$color}</b>:<br>
    18. <pre style='padding:5px;border:1px solid #ccc;'>
    19. {$matches[2][$i]}
    20. </pre>";
    21. }
    Hmm ok...

    Habs an einer anderen Stelle: Aber ich brauche es ja da unten in meiner if-Anweisung...

    PHP-Quellcode

    1. <?php
    2. error_reporting(E_ALL);
    3. $html = file_get_contents('http://www.dwd.de/dyn/app/ws/html/reports/WST_warning_de.html#WS_ANCHOR_0');
    4. if (!preg_match_all("
    5. /
    6. app_ws_warning_content_text
    7. .*?
    8. border-left-color\:\s*\#(\w{6})
    9. .*?
    10. ebp_ws_warning_content[^\>]+\>(.*?)\<\/div\>
    11. /isx", $html, $matches)) die("Es sind keine Warnungen für Hannover, Region vorhanden.");
    12. foreach($matches[1] as $i => $color)
    13. {
    14. echo "
    15. <div class='app_ws_warning_content_text' style='border-left-color: #".$color.";'>
    16. <a name='WS_ANCHOR_1'></a><a name='WS_ANCHOR_0'></a>
    17. <div id='ebp_ws_warning_content'>
    18. {$matches[2][$i]}
    19. </div>
    20. </div>
    21. "
    22. ;
    23. }
    24. $a = count ($matches[1]);
    25. if ($a = 3) {
    26. echo "<script type="text/javascript">timer1();</script>";
    27. } elseif ($a = 2) {
    28. echo "<script type="text/javascript">timer2();</script>";
    29. }
    30. echo $a;
    31. ?>
    in php ist das bisschen anders.

    PHP-Quellcode

    1. if ($a = 123) echo "ich konnte variable a den wert 123 zuweisen";
    2. if ($a == 123) echo "variable a hat den wert 123";

    das bietet unter anderem folgende möglichkeiten:

    PHP-Quellcode

    1. if ($html = @file_get_contents("dsfdf")) echo "alles ok";
    2. else echo "fehler";


    edit: oder gar folgendes:

    PHP-Quellcode

    1. if (($html = @file_get_contents("dsfdf")) === false) die("fehler");

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Agita“ ()