Bookmarken Twitter Feed

Linkfetcher – Mit PHP Links extrahieren

20. Juli 2008 | In: Php

Um aus einer Webseite alle Links zu extrahieren gibt es schon so einige Lösungen im Netz. Die meisten basieren auf einigen simplen regulären Ausdrücken. Da ich für ein aktuelles Projekt eine Möglichkeit brauchte um zusätzlich zu den Links auch alle Attribute, wie “title”, “rel”, “target” … etc. zu erhalten, habe ich dazu eine Klasse geschrieben.

Linkfetcher benötigt zwingend PHP 5 mit diversen Erweiterungen wie domobject, xpath, mb string … und liefert alle gefunden Links als array of stdClass mit den folgenden Attributen:

Attribute
‘rel’, ‘accesskey’, ‘charset’, ‘coords’, ‘href’, ‘hreflang’, ‘name’, ‘rev’, ’shape’, ‘tabindex’

Events
‘onblur’, ‘onfocus’, ‘onclick’, ‘ondblclick’, ‘onmousedown’, ‘onmouseup’, ‘onmouseover’, ‘onmousemove’, ‘onmouseout’, ‘onkeypress’, ‘onkeydown’, ‘onkeyup’

Universalattribute:
‘id’, ‘class’, ’style’, ‘title’

Sprachattribute:
‘dir’, ‘lang’

Nicht gefundene Attribute werden als “” leerer String zurückgegeben. Die Class-Properties nennen sich genau wie die Attribute in der HTML-Spezifikation. Einzig der Linktext wird in “text” abgelegt und kann über $link->text abgerufen werden.

Die folgenden Methoden sind implementiert:

GetLinks( $url ); extrahiert aus der angegebenen Url sämtliche Links inklusive aller Attribute.

GetLink( $link, $exact ); überprüft, ob $link beim letzen Aufruf von GetLinks(…) gefunden wurde. Der optionale Parameter exact legt fest, ob der Link genau übereinstimmen muss oder ob es reicht, wenn ein Link gleich beginnt.

Beispiel #1:
Der Codeschnipsel holt sämtliche Links von www.google.de und gibt sie inklusive aller Attribute aus.

include_once( 'linkfetcher.class.php' );
 
$Linkfetcher = new Linkfetcher();
 
$Linkfetcher->GetLinks( 'http://www.google.de' );
 
var_dump( $Linkfetcher->links );

Beispiel #2:
In diesem Beispiel werden wieder alle Links von www.google.de extrahiert. Anschliessend wird überprüft, ob der Link “http://images.google.de” in der Ergebnismenge enthalten ist. Da $exact auf false gesetzt wurde, genügt es, wenn ein Link mit “http://images.google.de” beginnt.
Bei Erfolg wird der gefundene Link als stdClass Object zurückgeliefert. False sonst.

include_once( 'linkfetcher.class.php' );
 
$Linkfetcher = new Linkfetcher();
 
$Linkfetcher->GetLinks( 'http://www.google.de' );
 
var_dump( $Linkfetcher->GetLink( 'http://images.google.de', false ) );

Beispiel #3:
Hole alle Links von www.google.de mit nur den Attributen href, rel und title

include_once( 'linkfetcher.class.php' );
 
$Linkfetcher = new Linkfetcher( 
 array( 'attributes' => array( 'href', 'rel', 'title' ) )
);
 
$Linkfetcher->GetLinks( 'http://www.google.de' );
 
var_dump( $Linkfetcher->links );

Update: Ein kleiner Fehler in einem regulären Ausdruck wurde beseitigt.

Download v1.1

Bewertung: najagut
Loading ... Loading ...

Ähnliche Beiträge



8 Kommentare zu Linkfetcher – Mit PHP Links extrahieren

Avatar

Mario

17. April 2009 um 12:11:28

Hallo, ich finde diese PHP-Klasse sehr nützlich nur da ich mich noch nicht mit PHP-Objekten beschäftigt habe, habe ich so meine Probleme mit dieser Klasse. Kannst du mal bitte an einem Beispiel zeigen, wie man die Links auflisten kann:
Beispiel:

- zu analysierende Seite hat 10 Links
- Links in einer Schleife ausgeben (Linktext, Linkziel)

Vielen Dank

Avatar

naden

17. April 2009 um 15:03:39

@mario, im ZIP-Archiv ist eine demo.php da ist ein Beispiel drin, wie auch hier auf der Webseite.

Infos zu PHP findest du auf http://de.php.net oder beim Hersteller http://www.zend.com

Avatar

Mario

19. April 2009 um 14:24:15

ja, das habe ich auch gesehen, aber wie kann ich z.B. auf den 5. gefunden Link zugreifen und das Linkziel ausgeben?

Avatar

naden

19. April 2009 um 21:05:29

$links = $Linkfetcher->GetLinks() liefert ein Array. Auf das 5. Element eines Arrays mit numerischem Index greift man mit $links[ 4 ] zu.

Auch nützlich: http://de.php.net/manual/de/language.types.array.php

Avatar

Xel

28. Mai 2009 um 01:39:26

Erstmal danke, dass du dir diese Mühe überhaupt gemacht hast.

Mir ist aber aufgefallen, dass das wirklich nur unter sehr speziellen Bedingungen richtig funktioniert.

Beispiele die nicht funktionieren:
gecrawled wird: example.org/test/test.html

a href=”foo.html” => example.org/test/test.htmlfoo.html
a href=”/foo.html” => example.org/test/test.html/foo.html
a href=”./foo.html” => example.org/test/test.html./foo.html

Eigentlich müsste aber
example.org/test/foo.html
example.org/foo.html
example.org/test/foo.html
rauskommen.

Avatar

naden

28. Mai 2009 um 14:02:55

@xel, ich habe auch immer wieder unerklärliche Probleme mit diversen Webseiten.

Leider habe ich für viele Probleme keine Lösung gefunden, da die Klasse massiv DOMXPath, xPath etc. nutzt und diese innerhalb der Bibliotheken auftreten.

Ich habe eine sehr viel neuere Version der Klasse rumliegen, die muss ich in den kommenden Tagen mal uploaden.

Avatar

Alex

14. Juli 2009 um 02:04:23

Hallo Naden,

erstmal vielen Dank für das Skript. Wirst du noch die neue Version uploaden?

Gruß
Alex

Avatar

naden

16. Juli 2009 um 17:55:47

@alex kommt! Ich muss die Doku nich etwas überarbeiten.

Schreib einen Kommentar

Fülle das Kommentar-Formular vollständig aus oder melde dich über Twitter oder Facebook an.
Sign in with Facebook

By Teledir Internetanbieter