Ankündigung

Einklappen
Keine Ankündigung bisher.

"getElementByClass" ?

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • "getElementByClass" ?

    Hallo!
    Hab mal ne kurze Frage. Gibt es eine bei DOMNode auch eine Methode wie etwa "getElementByClass"? Bräuchte nämlich alle Elemente einer HTML Seite mit dem Attribut "xyz".

  • #2
    Du meinst getElementsByClassName()?
    Nein, die gibt es wie in JavaScript nicht, lässt sich aber mit DOMDocument::getElementsByTagName('*') und DOMElement::getAttribute('class') genau wie in JavaScript nachbauen, auch wenns nicht sonderlich performant ist.

    Kommentar


    • #3
      Oder per XPath
      PHP-Code:
      <?php
      $doc 
      = new DOMDocument;
      $doc->loadxml('<html><head><title>xyz</title></head><body>
        <div class="foo">a</div>
        <div class="bar">b</div>
        <div class="foo bar">c</div>
        <div class="bar foo">d</div>
        <div class="xyz">e</div>
        <div class="foobar">nicht perfekt</div>
      </body></html>'
      );

      $xpath = new DOMXPath($doc);
      foreach( 
      $xpath->query('//div[contains(attribute::class, "foo")]') as $e ) {
        echo 
      $e->nodeValue"<br />\n";
      }

      Kommentar


      • #4
        Ich danke euch für die Antworten!

        Die Klasse DOMXPath kannte ich bislang noch gar nicht. Hab den Code aber ausprobiert und es funktioniert wunderbar. Auch wenn ich einige Probleme habe den ersten Parameter, also den String, in "query" zu verstehen. Gibt es da vielleicht Referenzen? Die Beschreibung auf php.net verstehe ich irgendwie nicht so ganz.

        Ansonsten hätte ich das so wie Manko10 schrieb gemacht. Das Problem ist halt die Laufzeit, ich kann nicht zu viele Schleifen programmieren.

        Schönen Gruß,
        Neuling08

        Kommentar


        • #5
          Zitat von Neuling08 Beitrag anzeigen
          Gibt es da vielleicht Referenzen?
          Jede Menge: xpath - Google Search

          Soweit ich weiß, steht Dir in PHP nur XPath 1.0 zur Verfügung.

          '//div[contains(attribute::class, "foo")]'
          XPath arbeitet immer mit einem Kontextknoten. Hier ist keiner angegeben, deshalb ist der Kontext das DocumentElement.
          // sämtliche Nachfahren
          //div sämtliche div Elemente
          //div[ xyz ] sämtliche div Element, die eine bestimmte Bedingung erfüllen
          contains(x,y) enthält x die Zeichenkette y ?
          contains(attribute::class, "foo") enthält das Attribut class (des aktuellen Knoten) die Zeichenkette foo?
          -->
          //div[contains(attribute::class, "foo")]
          sämtliche div Elemente, die ein Attribut class haben, das die Zeichenkette foo enthält.

          Kommentar


          • #6
            Bin gerade am rumexperimentieren.^^

            Also der umständliche Weg mit vielen Schleifen bei dem ich mich einfach am DOM Baum entlang hangel ist kein großes Problem.

            Aber ich habe gerade mit XPath versucht das alle <li> Tags aus allen <ul> Tags mit der o.b. Klasse herauszufiltern und es klappt nicht so ganz. Was mache ich denn falsch?

            PHP-Code:
            $xpath->query('//ul[contains(attribute::class, "list-of-articles")]/li'); 
            Edit: Ups. Scheint wohl doch zu funktionieren. Komisch...
            trotzdem danke !

            Kommentar


            • #7
              Mal ne Frage.
              Gibt es auch HTML Seiten die sich nicht parsen lassen?
              Z.B. durch irgendwelche Tricks etc. durch denen DOM Knoten nicht aufgegriffen werden können?

              Kommentar


              • #8
                Seiten, die extrem gegen den XML-Standard verstoßen könnten betroffen sein. Wenn du ältere HTML-Seiten verwenden willst, solltest du statt DOMDocument::loadXML(), DOMDocument::loadHTML() verwenden.

                Kommentar


                • #9
                  Ich verwende ja schon loadHTML() weil die Seite nicht wohlgeformt ist.
                  Hab vorhin schon manuell jeden einzelnen Tag daraufhin überprüft ob er geschlossen ist - was ziemlich lange gedauert hat - und dabei ist mir aufgefallen, dass ein wichtiger <div> Tag nicht geschlossen ist und ich den Inhalt nicht ganz auslesen kann.

                  Also diese Seite ist das: Top Podcasts of 2008

                  Kommentar


                  • #10
                    [Invalid] Markup Validation of http://www.uie.com/articles/top_podcasts_2008/ - W3C Markup Validator
                    Da werden schon ein paar Fehler angezeigt

                    Kommentar


                    • #11
                      Jap! Echt schlimm.
                      Die meisten Fehler sind aber nicht so tragisch, nur das was ich brauche, den Artikel, den bekomme ich irgendwie nicht. Ich kann den Inhalt aus dem entsprechenden <div> Tag auch nicht einfach mit nodeValue ausgeben und ich hab keine Ahnung woran das liegt.

                      Kommentar


                      • #12
                        Was willst Du denn erreichen? (Ist bestimmt etwas, dass nicht so offensichtlich gegen das Urheberrecht verstößt, dass ich als Laie das erkennen muss, nehme ich an.)

                        Kommentar


                        • #13
                          Die Seite hat mehrere Artikel, die nach dem gleichen Prinzip aufgebaut sind und weil ich nicht dauernd neue Artikel suchen möchte, will ich sie einfach auslesen und mir nur die neuesten automatisch anzeigen lassen.
                          Urheberrechtlich ist da auch nichts anzumerken, ich speicher die Artikel nicht ab und veröffentliche sie nicht. Ich nutze das nur privat.

                          Kommentar


                          • #14
                            Dann ist es vielleicht einfacher, wenn Du den RSS Feed auswertest.
                            UIE Brain Sparks

                            Kommentar


                            • #15
                              Ich sitze da seit 2 Tagen und sicher 20 oder mehr Stunden dran und das Ding hat ein RSS Feed
                              Ich könnte mich aufregen!


                              Naja. Hab aber gerade nachgesehen. Alle Inhalte der Seiten die ich will sind da nicht enthalten. Aber zur Not tut es das auch.

                              Aber das Thema interessiert mich trotzdem. Die Seite wollte ich vor allem deswegen mit PHP parsen, weil ich Erfahrungen sammeln möchte. Wie würde das denn funktionieren?


                              PS: vielen Dank David!

                              Kommentar

                              Lädt...
                              X