Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] foreach Schleife und domDocument

Einklappen

Neue Werbung 2019

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

  • [Erledigt] foreach Schleife und domDocument

    Hi,

    folgende foreach Schleife möchte nicht richtig funktionieren:

    PHP-Code:
    $sites2check file('sites2check.txt');

    foreach (
    $sites2check as $site2check) {
        
        
    $dom = new domDocument;
        @
    $dom->loadHTMLFile($site2check);
        
    $dom->preserveWhiteSpace false;
        
        foreach (
    $dom->getElementsByTagname('a') as $item) {
            
            echo 
    $item->getAttribute('href').'-> '.$item->nodeValue.'<br>';
            
        }
        

    sites2check.txt beinhaltet 2 urls:

    PHP-Code:
    http://www.domain1.de/links.html
    http://www.domain2.de/links.html 
    Domain1 beinhaltet 3 Links:
    PHP-Code:
    <a href="test.html">Domain1 Link1</a><br />
    <
    a href="test.html">Domain1 Link2</a><br />
    <
    a href="test.html">Domain1 Link3</a><br /> 
    Domain2 beinhaltet 5 Links:
    PHP-Code:
    <a href="test.html">Domain2 Link1</a><br />
    <
    a href="test.html">Domain2 Link2</a><br />
    <
    a href="test.html">Domain2 Link3</a><br />
    <
    a href="test.html">Domain2 Link4</a><br />
    <
    a href="test.html">Domain2 Link5</a><br /> 
    Ich bin in der Erwartung:
    PHP-Code:
    test.html-> Domain1 Link1
    test
    .html-> Domain1 Link2
    test
    .html-> Domain1 Link3
    test
    .html-> Domain2 Link1
    test
    .html-> Domain2 Link2
    test
    .html-> Domain2 Link3
    test
    .html-> Domain2 Link4
    test
    .html-> Domain2 Link5 
    Aber erhalte als Ergebnis:
    PHP-Code:
    /links.html-> /links.html
    test
    .html-> Domain2 Link1
    test
    .html-> Domain2 Link2
    test
    .html-> Domain2 Link3
    test
    .html-> Domain2 Link4
    test
    .html-> Domain2 Link5 
    Die Links von der Domain1 werden nicht erfasst, was mache ich denn falsch?

    Über jeden Tipp bin ich sehr dankbar.

  • #2
    Als erstes würde ich mal das @ entfernen.

    Kommentar


    • #3
      Habe ich entfernt, aber das Ergebnis bleibt das Gleiche.

      Kommentar


      • #4
        Ich tippe mal auf das \n am Ende des Listeneintrags.

        Kommentar


        • #5
          Mach aus
          Code:
          $dom->getElementsByTagname
          mal
          Code:
          $dom->getElementsByTagName
          Und um die Performance zu optimieren, solltest du den Aufruf nicht in der foreach machen, sondern einmal vorher und dir das Ergebnis in einem Array speichern.

          PHP-Code:
          $tags $dom->getElementsByTagName('a');

          foreach (
          $tags as $item) {
              ...

          Kommentar


          • #6
            Funktionen in PHP sind case-insensitiv. Und wo der zweite Tipp Performace spart, sehe ich auch nicht.

            Kommentar


            • #7
              Error-Reporting hochgedreht ?

              Kommentar


              • #8
                Ok, der Methodenname war es nicht, aber der Performancegewinn lässt sich ganz einfach messen.

                In diesem Beispiel hat die Seite nur 7 Links und der Performancegewinn ist schon beachtlich.

                0.00267 zu 0.00089

                PHP-Code:
                $dom = new DOMDocument();
                $dom->loadHTMLFile("test.html");

                $start microtime(true);
                foreach (
                $dom->getElementsByTagName('a') as $tag) {
                    echo 
                $tag->getAttribute('href') . "\n";
                }
                echo (
                microtime(true) - $start) . "<br />"// 0.00267 sec

                $tags2 $dom->getElementsByTagName('a');

                $start microtime(true);
                foreach (
                $tags2 as $tag2) {
                    echo 
                $tag2->getAttribute('href') . "\n";
                }
                echo (
                microtime(true) - $start) . "<br />"// 0.00089 
                Noch deutlicher wird es hier.
                PHP-Code:
                $array = array();

                for (
                $i 0$i 1000000$i++) {
                    
                $array[$i] = $i;
                }

                $start microtime(true);
                for (
                $j 0$j sizeof($array); $j++) {

                }
                echo (
                microtime(true) - $start) . "<br />"// 3.5 sec

                $size sizeof($array);
                $start microtime(true);
                for (
                $j 0$j $size$j++) {

                }
                echo (
                microtime(true) - $start) . "<br />"// 0.7 sec 

                Kommentar


                • #9
                  Code 1) Hast Du die Aufrufe mal umgedreht? Ich würde da eher ein Caching des DOM vermuten
                  Code 2) Äpfel und Birnen. Der zweite Teil eines for-Statements wird auch bei jedem Durchlauf ausgewertet, der erste (ebenso bei foreach) aber nur einmal initial.

                  Kommentar


                  • #10
                    Zitat von nikosch Beitrag anzeigen
                    Ich tippe mal auf das \n am Ende des Listeneintrags.
                    Habe ich schon kontrolliert, ein \n am Ende des Listeneintrag befindet sich nicht.

                    Zitat von Thor Beitrag anzeigen
                    Mach aus
                    Code:
                    $dom->getElementsByTagname
                    mal
                    Code:
                    $dom->getElementsByTagName
                    Führt leider zum selben Ergebnis.

                    Zitat von tr0y Beitrag anzeigen
                    Error-Reporting hochgedreht ?
                    Ja, sie ist eingschaltet: error_reporting(E_ALL);

                    Kommentar


                    • #11
                      Ich habe ein 3. url/Domain in die sites2check.txt aufgenommen, und stelle jetzt fest, das immer nur Links von der letzten Listeneintrag/Domain erfasst werden.

                      Kommentar


                      • #12
                        wenn ich statt:

                        PHP-Code:
                        $sites2check file('sites2check.txt'); 
                        folgendes verwende, dann funktioniert es:
                        PHP-Code:
                        $sites2check = array(
                        'http://www.domain1.de/links.html',
                        'http://www.domain2.de/links.html'
                        ); 
                        Das ist aber leider nicht die Lösung die ich suche, die Werte müssen unbedingt aus der txt Datei eingelesen werden.

                        Kommentar


                        • #13
                          PHP-Code:
                          $urls file('sites2check.txt');
                          $dom = new DOMDocument();
                          $dataSpin = array();

                          foreach (
                          $urls as $siteNum => $site2check) { 
                              
                          $siteStats = array('url' => $site2check);
                              
                          $DOMState $dom->loadHTMLFile($site2check); 
                              if ( 
                          $DOMState ) {
                                 
                          $siteStats['status'] = 'parsed';

                                 
                          $dom->preserveWhiteSpace false
                                 
                          $elements $dom->getElementsByTagname('a');

                                 
                          $siteStats['foundElements'] = count($elements);

                                 foreach (
                          $elements as $item) { 
                                     echo 
                          $item->getAttribute('href').'-> '.$item->nodeValue.'<br>';
                                 } 
                              }   
                              else 
                          $siteStats['status'] = 'parsing failed';

                              
                          $dataSpin[$siteNum] = $siteStats;
                              unset(
                          $siteStats);
                          }

                          var_dump($dataSpin); 
                          was sagt dir das var_dump(...) ?

                          Edit: ah..

                          probier das:

                          PHP-Code:
                          $urls file('sites2check.txt');
                          $dom = new DOMDocument();
                          $dataSpin = array();

                          foreach (
                          $urls as $siteNum => $site2check) { 
                              
                          $siteStats = array('url' => $site2check);
                              
                          $DOMState $dom->loadHTMLFile(trim($site2check)); 
                              if ( 
                          $DOMState ) {
                                 
                          $siteStats['status'] = 'parsed';

                                 
                          $dom->preserveWhiteSpace false
                                 
                          $elements $dom->getElementsByTagname('a');

                                 
                          $siteStats['foundElements'] = count($elements);

                                 foreach (
                          $elements as $item) { 
                                     echo 
                          $item->getAttribute('href').'-> '.$item->nodeValue.'<br>';
                                 } 
                              }   
                              else 
                          $siteStats['status'] = 'parsing failed';

                              
                          $dataSpin[$siteNum] = $siteStats;
                              unset(
                          $siteStats);
                          }

                          var_dump($dataSpin); 

                          Kommentar


                          • #14
                            Habe ich schon kontrolliert, ein \n am Ende des Listeneintrag befindet sich nicht.
                            Doch. Der Zeilenumbruch in der Datei wird von file() nicht entfernt. Also bitte trim benutzen.

                            Kommentar


                            • #15
                              Zitat von nikosch Beitrag anzeigen
                              Doch. Der Zeilenumbruch in der Datei wird von file() nicht entfernt. Also bitte trim benutzen.
                              Sorry, hatte wohl nicht genau verstanden gehabt mit "\n am Ende des Listeneintrag", aber genau das war das Problem, jetzt funktioniert alles einwandfrei, ich danke dir vielmals, hast mir die Wochenende gerettet!

                              Auch allen anderen Danke für die Mühe.

                              Ich wünsch euch allen ein schönes Wochenende!

                              Kommentar

                              Lädt...
                              X