WinFuture-Forum.de: Php- Html- Links Auslesen - WinFuture-Forum.de

Zum Inhalt wechseln

Nachrichten zum Thema: Entwicklung
  • 2 Seiten +
  • 1
  • 2

Php- Html- Links Auslesen


#1 Mitglied ist offline   fineliner 

  • Gruppe: aktive Mitglieder
  • Beiträge: 106
  • Beigetreten: 14. Januar 05
  • Reputation: 0

geschrieben 10. Juni 2006 - 01:58

wie kann ich aus einem html-dokument (das ich als string eingelesen habe)
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?
0

Anzeige



#2 Mitglied ist offline   Gitarremann 

  • Gruppe: aktive Mitglieder
  • Beiträge: 3.263
  • Beigetreten: 04. Juni 06
  • Reputation: 3
  • Geschlecht:Männlich
  • Wohnort:Trebnitz

geschrieben 10. Juni 2006 - 02:31

also vom schema her müsste man einfach nur nach

href="

suchen und alles was danach kommt, bis zum nächsten anführungszeichen extrahieren. bin ich aber im moment irgendwie zu müde.
Der Pessimist sagt: "Das Glas ist halb leer,"
Der Optimist sagt: "Das Glas ist halb voll."
Der Realist sagt: "Bedienung, zwei Neue!"
0

#3 Mitglied ist offline   fineliner 

  • Gruppe: aktive Mitglieder
  • Beiträge: 106
  • Beigetreten: 14. Januar 05
  • Reputation: 0

geschrieben 10. Juni 2006 - 14:41

jup so krieg ich den ersten link, wie krieg ich den rest? :(
0

#4 Mitglied ist offline   stefanra 

  • Gruppe: aktive Mitglieder
  • Beiträge: 6.208
  • Beigetreten: 13. September 04
  • Reputation: 1

geschrieben 10. Juni 2006 - 15:07

Du könntest es auch mit Javascript und DOM machen.
0

#5 Mitglied ist offline   Gitarremann 

  • Gruppe: aktive Mitglieder
  • Beiträge: 3.263
  • Beigetreten: 04. Juni 06
  • Reputation: 3
  • Geschlecht:Männlich
  • Wohnort:Trebnitz

geschrieben 10. Juni 2006 - 16:50

 Zitat (Gitarremann: 10.06.2006, 03:31)

also vom schema her müsste man einfach nur nach

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 Pessimist sagt: "Das Glas ist halb leer,"
Der Optimist sagt: "Das Glas ist halb voll."
Der Realist sagt: "Bedienung, zwei Neue!"
0

#6 Mitglied ist offline   MNG 

  • Gruppe: aktive Mitglieder
  • Beiträge: 293
  • Beigetreten: 29. März 06
  • Reputation: 0

geschrieben 10. Juni 2006 - 17:07

Moin,

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

0

#7 Mitglied ist offline   fineliner 

  • Gruppe: aktive Mitglieder
  • Beiträge: 106
  • Beigetreten: 14. Januar 05
  • Reputation: 0

geschrieben 10. Juni 2006 - 18:48

danke euch allen
danke mng
für den code, irgendwann muss ich das mit dem regxp noch lernen :D
0

#8 Mitglied ist offline   Gitarremann 

  • Gruppe: aktive Mitglieder
  • Beiträge: 3.263
  • Beigetreten: 04. Juni 06
  • Reputation: 3
  • Geschlecht:Männlich
  • Wohnort:Trebnitz

geschrieben 11. Juni 2006 - 11:36

na toll - so geht mir das immer. ich schreib lange scripte und mache manchmal noch schicke funktionen draus, um wenn ich fertig bin zu er fahren, dass es da einen einzigen befehl für gibt.
Der Pessimist sagt: "Das Glas ist halb leer,"
Der Optimist sagt: "Das Glas ist halb voll."
Der Realist sagt: "Bedienung, zwei Neue!"
0

#9 Mitglied ist offline   fineliner 

  • Gruppe: aktive Mitglieder
  • Beiträge: 106
  • Beigetreten: 14. Januar 05
  • Reputation: 0

  geschrieben 11. Juni 2006 - 12:00

@ gitarrenmann

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

Warning: Invalid argument supplied for foreach() in /home/www/hosting/fine/htdocs/edit3.php on line 43

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

0

#10 Mitglied ist offline   MNG 

  • Gruppe: aktive Mitglieder
  • Beiträge: 293
  • Beigetreten: 29. März 06
  • Reputation: 0

geschrieben 11. Juni 2006 - 12:48

Moin,

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

0

#11 Mitglied ist offline   fineliner 

  • Gruppe: aktive Mitglieder
  • Beiträge: 106
  • Beigetreten: 14. Januar 05
  • Reputation: 0

geschrieben 11. Juni 2006 - 14:23

@mng

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 :D )

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 :blink: :D



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

0

#12 Mitglied ist offline   MNG 

  • Gruppe: aktive Mitglieder
  • Beiträge: 293
  • Beigetreten: 29. März 06
  • Reputation: 0

geschrieben 11. Juni 2006 - 14:33

Moin,

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.
0

#13 Mitglied ist offline   fineliner 

  • Gruppe: aktive Mitglieder
  • Beiträge: 106
  • Beigetreten: 14. Januar 05
  • Reputation: 0

geschrieben 11. Juni 2006 - 14:41

ahaaaaaaa :D

hab zwar noch immer keine ahnung was die () tut (segmentiert?) :blink:
aber ich versuch es jetzt mal so :-)
danke mng
0

#14 Mitglied ist offline   fineliner 

  • Gruppe: aktive Mitglieder
  • Beiträge: 106
  • Beigetreten: 14. Januar 05
  • Reputation: 0

geschrieben 11. Juni 2006 - 17:45

funktioniert jetzt, danke :D

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

:blink:
0

#15 Mitglied ist offline   MNG 

  • Gruppe: aktive Mitglieder
  • Beiträge: 293
  • Beigetreten: 29. März 06
  • Reputation: 0

geschrieben 11. Juni 2006 - 18:35

Die Klammern erlauben dir, bestimmte Teile eines Matches (einer Übereinstimmung) direkt anzusprechen. Der erste Bereich in Klammern wird dann in $alleLinks[1] sein, der zweite Bereich in Klammern wird in $alleLinks[2] sein, usw. In $alleLinks[0] befindet sich der gesamte, übereinstimmende String. In meinem ersten Beispiel sind die geklammerten Segmente ja in dem Muster verteilt:
"!<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

0

Thema verteilen:


  • 2 Seiten +
  • 1
  • 2

1 Besucher lesen dieses Thema
Mitglieder: 0, Gäste: 1, unsichtbare Mitglieder: 0