TaiSon: alle LINKS und titel der Links aus einer Datei extrahieren

Ich möchte gerne alle Links, URLs aus einer Datei, Seite auslesen, inkl. des Titels

Das mit der URL bekomme ich einigermassen hin, aber nicht das mit dem Titel, Ich habe zwar einen Rest der in $links[0] steht, aber ich denke das ist auch alles andere drin.

Wie gehe ich am besten vor, wenn ich die Atribute titel und name auch noch rausfiltern will

$ausgangsdatei = 'http://www.google.de';
$html = file_get_contents($url);
$links = array();

if (preg_match_all('/<a\s+.*?href=[\"\']?([^\"\' >]*)[\"\']?[^>]*>(.*?)<\/a>/si', $html, $links)) {
    $links = $links[1];
}

echo'<pre>';
print_r ($links);
echo'</pre>';
  1. Hallo,

    Ich möchte gerne alle Links, URLs aus einer Datei, Seite auslesen, inkl. des Titels
    Wie gehe ich am besten vor, wenn ich die Atribute titel und name auch noch rausfiltern will

    Benutze die DOMDocument-Klassen

    Grüße
    TS

    1. Hallo TS,

      Wau das ist richtig super...

      $att_ahref = $dom->getElementsByTagName('a');
      

      und schon habe ich alle <a> LINKS

      mit...

      foreach ( $att_ahref as $key => $value )
      {
      
      }
      

      ... lesen ich es aus.

      Aber wa sich nicht kapiere...

      mit

      print_r ($att_ahref);
      

      oder

      var_dump ($att_ahref);
      

      bekomme ich keine Übersicht.

      1. Hallo TaiSon,

        Wau das ist richtig super...

        $a_nodeList = $dom->getElementsByTagName('a');
        

        und schon habe ich alle <a> LINKS

        Du bekommst eine Nodelist. Das ist eine Life-Collection (aktive Verweisliste) auf den originalen DOT (Documnet Object Tree).

        Die Liste kannst Du mit foreach() iterieren, so wie Du das schon machst. Das Foreach() ist da aber nur "reingebastelt". Die übrigen Eigenschaften, die Foreach sonst auszeichnet (in der prozeduralen Programmierung) funktionieren hier (noch) nicht. Alternatic kannst Du mit

        $a_node = $a_nodeList->item($index);
        

        direkt auf eine Zeile in der Liste zugreifen. Die Zählung beginnt bei 0. Du solltest aber den Index ($index) nicht außerhalb des erlaubten Ranges wählen. Das gibt auf die Finger.
        Die Anzahl der Nodes erfährst Du mit

        $anzahl = $a_nodeList->length; 
        

        Das musst Du aber nicht umkopieren, habe ich hier nur zum Merken gemacht. Du kannst immer direkt mit den Properties arbeiten.

        Du solltest auch besser gewählte Variablennamen nutzen. Du kannst die Nodes dann auch weiter auslesen.

        foreach ( $a_nodelist as $itemno => $node )
        {
            if ($node->hasAttributes())
            {
                print_r($node->attributes);
            }
        
            echo $node->textContent;
        }
        

        ... lesen ich es aus.

        Aber wa sich nicht kapiere...

        mit

        print_r ($att_ahref);
        

        Ja, das ist ein Objekt (hier eine "Life-Collection" oder "Dynaset" of Objects) und print_r() und var_dunp() können die Objekte (noch) nicht vollständig darstellen (da die flüchtig sind). Das will man meistens auch nicht. Hängt auch von der PHP-Version ab, was die inzwischen können.

        Hangel dich einfach mal durch alle Methoden und Properties von DOMDocument und DOMNode, das sind die wichtigsten.

        Grüße
        TS

        1. Hallo TaiSon,

          
          > foreach ( $a_nodelist as $itemno => $node )
          > {
          >     if ($node->hasAttributes())
          >     {
          >##         print_r($node->attributes);
          >     }
          > 
          >     echo $node->textContent;
          > }
          
          

          Das machen wir noch etwas anders:

          foreach ( $a_nodelist as $index => $node )
          {
              if ($node->hasAttributes())
              {
                  $liste = array();
                  foreach ($node->attributes as $attr)
                  {
                      $liste[$attr->nodeName] = $attr->nodeValue;
                  }
          
                  print_r($liste);
              }
              
              echo $node->textContent;
          }
          

          Grüße
          TS