Php- Html- Links Auslesen
#1
geschrieben 10. Juni 2006 - 01:58
alle links (oder anch speziellem muster (regexp versteh ich nicht ganz))
auslesen und dann zum beispiel als array oder als strings weiterzuverarbeiten
könnt ihr mir einen beispielcode mit
$seiteninhalt
schreiben?
Anzeige
#2
geschrieben 10. Juni 2006 - 02:31
href="
suchen und alles was danach kommt, bis zum nächsten anführungszeichen extrahieren. bin ich aber im moment irgendwie zu müde.
Der Optimist sagt: "Das Glas ist halb voll."
Der Realist sagt: "Bedienung, zwei Neue!"
#3
geschrieben 10. Juni 2006 - 14:41

#5
geschrieben 10. Juni 2006 - 16:50
Zitat (Gitarremann: 10.06.2006, 03:31)
href="
suchen und alles was danach kommt, bis zum nächsten anführungszeichen extrahieren. bin ich aber im moment irgendwie zu müde.
vielleicht erst einmal eine routine durchlaufen lassen, die alle links zählt und dann so oft den "link-extrahierer" durchlaufen lassen, wie links vorhanden sind und aktuellen durchlauf - 1 links dabei überspringen. wenn dann also 5 links drin sind dann durchlaufen lassen, die routine zählt 5 links. dann 5 mal durchlaufen lassen. 1 durchlauf (1-1) links, also 0 werden übersprungen, der erste wird gefunden. 2. durchlauf 2-1 als 1 link wird übersprungen, der 2. also extrahiert usw.
Dieser Beitrag wurde von Gitarremann bearbeitet: 10. Juni 2006 - 16:54
Der Optimist sagt: "Das Glas ist halb voll."
Der Realist sagt: "Bedienung, zwei Neue!"
#6
geschrieben 10. Juni 2006 - 17:07
für sowas nimmt man aber wirklich RegExp's, damit gehts am leichtesten:
// Links aus der Seiteninhalt holen:
preg_match_all("!<a.*?href=\"([^\"]*)\"[^>]*>(.*?)</a>!",$seiteninhalt, $alleLinks);
// Über alle Links iterieren:
foreach ($alleLinks[1] as $link)
{
echo $link.'<br>';
}
Der sollte es tun. Vergiss aber nicht: In einer Webseite kann es auch relative Links geben! In dem Fall ($link beginnt dann NICHT mit "http") müsstest du die Adresse, von der du $seiteninhalt hast, geeignet vorne an $link dranhängen.
Dieser Beitrag wurde von Flo bearbeitet: 14. Juni 2006 - 21:35
#7
geschrieben 10. Juni 2006 - 18:48
danke mng
für den code, irgendwann muss ich das mit dem regxp noch lernen

#8
geschrieben 11. Juni 2006 - 11:36
Der Optimist sagt: "Das Glas ist halb voll."
Der Realist sagt: "Bedienung, zwei Neue!"
#9
geschrieben 11. Juni 2006 - 12:00
dann beruhigt es dich ja vielleicht dass zwar den code, den MNG mir gegeben hat funktioniert,
wenn ich es dann aber selbst probiere, es nicht hinhaut......
könnt ihr mir sagen, warum mein code diesen fehler:
Zitat
ausgibt?
hab sogar die regexp überprüft
der code:
<?php
echo "HERZLICH WILLKOMMEN BEIM UNNÖTIGEN DING HIER<br/>";
$googNR="";
for($i=0;$i<2;$i++){
$googNR = $i*10;
$url = "http://www.google.com/search?q=%22www.winfuture.de%22&hl=de&hs=05T&lr=&client=opera&rls=de&start=".$googNR."&sa=N";
//echo $url."<br>\n";
if($file=fopen($url,'r'));
{
while(!feof($file)) {
$seiteninhalt .= fgets($file);
}
}
//echo $seiteninhalt."<br>\n";
}
preg_match_all("!<a.*?href=\"([^\"]*cache[^\"]*)\"[^>]*>(.*?)</a>!",$seiteninhalt, $alleLinks);
// Über alle Links iterieren:
$seiteninhalt="";
foreach ($alleLinks[1] as $link)
{
//google-cache-text only
$link2 = substr_replace($link, '&lr=&client=opera&strip=1', strlen($link)-strlen("&ct=clnk&cd=5&ie=UTF-8&client=opera"), strlen("&ct=clnk&cd=5&ie=UTF-8&client=opera"));
//echo $link2."<br>\n";
$url = $link2;
echo $url."<br>\n";
if($file=fopen($url,'r'));
{
while(!feof($file)) {
$seiteninhalt .= fgets($file);
}
}
}
// echo $seiteninhalt."\n"; // ist genau das was ich will
//* Block- ein/aus
preg_match_all("!http\:\/\/\<b.style\=\"color\:black\;background\-color\:\#ffff66\"\>www\.WinFuture\.de!",$seiteninhalt, $alleLinks2); //liefert in der überprüfung die richtigen ergebnisse
// Über alle Links iterieren:
foreach ($alleLinks2[1] as $link2) // scheint dann leer zu sein
{
echo $link2."<br>\n";
}
// */ Block aus
?>
Dieser Beitrag wurde von Flo bearbeitet: 14. Juni 2006 - 21:35
#10
geschrieben 11. Juni 2006 - 12:48
ist ein winziger Fehler drin. Dein RegEx matcht zwar gegen bestimmte Textpassagen, aber du hast keine groups definiert! Das machst du, indem du die Teile des Matches, die dich interessieren, in runde Klammern setzt. Dein Fehler tritt im Moment auf, weil du in der foreach-Schleife auf das erste group-Segment zugreifen willst ($alleLinks2[1]), diese aber nicht definiert ist. Abhilfe: Die Teile deines RegEx einklammern mit ( und ), die dich interessieren.
Aber welche Textteile willst du damit eigentlich finden:
"!http\:\/\/\<b.style\=\"color\:black\;background\-color\:\#ffff66\"\>www\.WinFuture\.de!"
Das Ding match ja ausschliesslich auf
http://<b.style="color:black;background-color:#ffff66">www.Winfuture.de
da keine variablen Segmente im RegEx sind?
Dieser Beitrag wurde von MNG bearbeitet: 11. Juni 2006 - 12:49
#11
geschrieben 11. Juni 2006 - 14:23
weil du in der foreach-Schleife auf das erste group-Segment zugreifen willst ($alleLinks2[1]), diese aber nicht definiert ist
wieso ist die nicht definiert? da sollten doch alle treffer enthalten sein oder?
wieso sind die treffer nicht enthalten?
wie schaff ich es, dass alle treffer dort drin stehen ( ich weiß der wert der treffer wird immer:(www.winfuture.de) sein aber die anzahl ist interessant zb

http://<b.style="color:black;background-color:#ffff66">www.Winfuture.de
naja fürs erste würde es mir ja reichen wenn es genau das finden würde und nicht ein (invalid argument) unbrauchbares argument zurückliefert


btw.
hab schon gelernt, nächster schritt wäre dann
!www\.winfuture\.de\/[^\/]+\/!
aber die regexp ist doch nicht mein problem oder?
Dieser Beitrag wurde von fineliner bearbeitet: 11. Juni 2006 - 14:37
#12
geschrieben 11. Juni 2006 - 14:33
doch, denn dein RegEx match zwar, d.h. er findet eine passende Stelle, aber du gruppierst den Match nicht, d.h. du erzeugst keine Segmente. Deswegen semmelt der Code bei der foreach-Schleife ab, weil
$alleLinks2[1] nicht existiert. Ändere deinen RegEx mal in
"!(http\:\/\/\<b.style\=\"color\:black\;background\-color\:\#ffff66\"\>www\.WinFuture\.de)!"
Dass erzeugt eine Gruppe aus dem gesamten Match, weswegen $alleLinks2[1] dann definiert ist.
#13
geschrieben 11. Juni 2006 - 14:41

hab zwar noch immer keine ahnung was die () tut (segmentiert?)

aber ich versuch es jetzt mal so :-)
danke mng
#14
geschrieben 11. Juni 2006 - 17:45

ohne die klammern sind dann alle ergebnisse ein string?
wieso musstest du MNG bei deinem beispiel keine machen?

#15
geschrieben 11. Juni 2006 - 18:35
"!<a.*?href=\"([^\"]*)\"[^>]*>(.*?)</a>!"
^------^ ^--^
Das erste Segment (landet in $alleLinks[1]) enthält den Text, der im href="blabla" steht. Das zweite Segment (landet in $alleLinks[2]) enthält den Text, der den Link beschreibt.
Im Nachhinein liest sich meine Erklärung bescheuert, ich hoffe, du erkennst, wie es gemeint ist

Dieser Beitrag wurde von MNG bearbeitet: 11. Juni 2006 - 18:37