franc: Value eines Attributs aus einem Element parsen

Hallo

ich bin nun schon eine Weile am Herumprobieren mit dem "Simple HTML DOM Parser" aber komme nicht richtig weiter.
Ich habe eine Webseite, in der sich mehrere Elemente <meta .../> befinden.
In diesen Elementen gibt es Attribute "itemprop" und "content", jedes hat einen Wert.
Ich möchte nun für eine Art "Preisalarm" den Wert des Attributs "content" des meta-Tag mit dem Attribut itemprop="price" herausparsen.

Also: finde den Wert des Attributs content, in einem meta-Tag, in dem das Attribut itemprop den Wert "price" hat.

Wie geht das denn am einfachsten ohne großen evtl. unnötigen Überbau?

Danke für einen Tipp

franc

  1. Nach HTML sieht das nicht aus :)

    Also: finde den Wert des Attributs content, in einem meta-Tag, in dem das Attribut itemprop den Wert "price" hat.

    Der Simple HTML DOM Parser unterstützt afaik XPath 1.0 - daher kommst du an den Attribut-Knoten mit folgendem Pfad:

    //meta[@itemprop='price']/@content

    Den Wert des Knotens bekommst du mit XPath 1.0 aber nicht - da musst du dann schon DOM-Methoden bemühen.

    1. //meta[@itemprop='price']/@content

      Den Wert des Knotens bekommst du mit XPath 1.0 aber nicht - da musst du dann schon DOM-Methoden bemühen.

      Also kann ich mein Ziel mit dem Simple HTML DOM Parser nicht erreichen?
      Was für Tools gibt es für meine Zwecke denn dann?
      Ich könnte natürlich mit PHP das Ergebnis eines curl oder wget selbst herausholen, aber ich bin mir fast sicher, dass so ein Rad längst erfunden ist, aber wo?

      1. da musst du dann schon DOM-Methoden bemühen.

        Also kann ich mein Ziel mit dem Simple HTML DOM Parser nicht erreichen?
        Was für Tools gibt es für meine Zwecke denn dann?

        Es ist also dann doch viel einfacher, den Simple HTML DOM Parser braucht man gar nicht, sondern tatsächlich DOM-Methoden:

        The DOMElement class

        So funktioniert es, ein Beispiel:

          
        <?php  
          
        // Sucht aus einer Webseite einen bestimmten Wert eines Attributes, wenn der Tag und ein Attribut-Wert-Paar bekannt ist.  
        //  
        // Beispiel: Im Market soll fuer die App SlideIT (also Webseite von SlideIT im Market = $website) der aktuelle Preis geholt werden.  
        // Hierzu wird aus dem $tagname "meta" soll der $searchvalue (Wert) von "content" geholt werden,  
        // bekannt ist $attribute "itemprop" und dessen $value "price".  
        // <meta itemprop="price" content="4,57 €" />4,57 €  
        //  
        // Aufrufbeispiel:  
        // http://example.org/pricealarm.php?tagname=meta&attribute=itemprop&value=price&searchattribute=content&trigger=1.0  
          
        $tagname = $_GET["tagname"];  
        $attribute =  $_GET["attribute"];  
        $value = $_GET["value"];  
        $searchattribute = $_GET["searchattribute"];  
        $website = $_GET["website"];  
        $email = $_GET["email"];  
        // mit trigger loest man ein mail (noch nicht implementiert) aus, wenn der Wert unterhalb des Wertes trigger liegt.  
        $trigger = $_GET["trigger"];  
          
        if ($tagname == "")  
            $tagname = "meta";  
          
        if ($attribute == "")  
            $attribute = "itemprop";  
          
        if ($value == "")  
            $value = "price";  
          
        if ($searchattribute == "")  
            $searchattribute = "content";  
          
        if ($website == "")  
        {  
            $content = file_get_contents('https://play.google.com/store/apps/details?id=com.dasur.slideit&feature=search_result#?t=W251bGwsMSwxLDEsImNvbS5kYXN1ci5zbGlkZWl0Il0.');  
        }  
        else  
        {  
            $content = file_get_contents($website);  
        }  
          
        if ($email == "")  
            $email = "my@email.org";  
          
        if ($trigger == "")  
            $trigger = 2.0;  
          
        $doc = new DOMDocument();  
        $doc->recover = true;  
        $doc->strictErrorChecking = false;  
        @$doc->loadHTML($content);  
          
        $tags_ammount = $doc->getElementsByTagName($tagname)->length;  
          
        for ($i = 0; $i < $tags_ammount; $i++) {  
          
            if ($doc->getElementsByTagName($tagname)->item($i)->getAttribute($attribute) == $value)  
            {  
                $pricefield = $doc->getElementsByTagName($tagname)->item($i)->getAttribute($searchattribute);  
          
                preg_match('/(\d+\,\d{2})/i', $pricefield, $pureprice);  
          
                echo "Der aktuelle Preis ist: {$pureprice[1]}\n";  
          
                if ($price <= $trigger)  
                {  
                    // ToDo: email senden mit aktuellem Preis  
                }  
                exit;  
            }  
        }  
          
        ?>  
        
        

        Das ist noch nicht fertig und sicher holprig programmiert aber im Prinzip funktioniert es so.
        Mailfunktionalität muss man dann noch einbinden mit der Mail-Bibliothek für PHP, usw.

        franc