URLs aus HTML-Seite extrahieren
|
Seitenanfang |
| Hallo! Ich möchte aus einer Website URLs extrahieren. Probleme bereitet mir, das die Links in einer Wurst in der HTML-Seite stehen also so: <a href="http://...">link</a><a href="http://...">link</a><a href="http://...">link</a> Ich hätte die Datei zeilenweise eingelesen und in jeder Zeile eine RegEx angewendet. Aber das funzt ja nicht, wenn alle Links in einer einzigen Zeile stehen. Mir fällt grad keine Lösung dazu ein. Kann mir hier jemand weiterhelfen? Gruß ruediger
Datum: 15.06.2006-23:37

|
re: URLs aus HTML-Seite extrahieren
|
Seitenanfang |
hi, habs net ausprobiert aber das sollte funzen:my $i; my @links; while ($linkstr =~ s/<a.*?href="(.*?)".*?>//s) { $links[$i] = $1; $i++; } heisst auf gur seutsch soviel wie: durchsuche den linkstring nach link tags solange bis keiner mehr gefunden wird und packe diese einem nach dem anderen in das array links. denke das funktioniert. Gruß Chris
Datum: 16.06.2006-00:00

|
re: URLs aus HTML-Seite extrahieren
|
Seitenanfang |
Funktioniert leider nicht. #!/usr/bin/perl -wuse strict; my $full; open (FILE, "test.html") or die "Can't open test.txt"; while (my $line = <FILE>) { chomp $line; $full .= $line; } close (FILE); while ($full =~ s/<td class=\"ebcTtl\"><h3 class=\".+\"><a href=\"(.*)\">(.*)<\/a><\/h3>.*<\/td>//s) { print "URL: $1\n"; print "Linktext: $2\n"; }
Er gibt mir X mal den letzten Link von test.html aus???
Datum: 16.06.2006-00:20

|
re: URLs aus HTML-Seite extrahieren
|
Seitenanfang |
| oh ja sorry die regex war greedy. die muss folgendermassen aussehen (habe auch noch ein Case ignore angehängt daamit es egal ist ob die tags gross oder klein geschrieben sind): $linkstr =~ s/<a.*?href="(.*?)".*?>//si habs ausprobiert funzt 100%ig
Datum: 16.06.2006-00:36

|
re: URLs aus HTML-Seite extrahieren
|
Seitenanfang |
| Funzt aucht nicht denn ich brauche alle Links nicht nur 1.
Datum: 16.06.2006-00:45

|
re: URLs extrahieren hier mein komplettes script
|
Seitenanfang |
| Habs angepasst damit du auch die linktexte extrahierst. #!f:/programme/xampp/perl/perl.exe -w open (DAT, "test.html"); my $linkstr = <DAT>; close(DAT); my $i; my @links; while ($linkstr =~ s/<a.*?href="(.*?)".*?>(.*?)<\/a>?//si) { $links[$i] = $1." - ". $2; $i++; } for (0..$#links) { print $links[$_]."\n"; } 1;
Datum: 16.06.2006-00:47

|
re: URLs extrahieren hier mein komplettes script
|
Seitenanfang |
| Danke jetzt funktioniert es. Aber eine Frage habe ich noch: warum zeigt mir das Skript nur den letzten Link, wenn ich die Fragezeichen weglasse?
Datum: 16.06.2006-01:15

|
re: URLs extrahieren hier mein komplettes script
|
Seitenanfang |
| ohne die fragezeichen sucht die regex bis zum letzten vorkommen des zeichens sprich bis zum ende. mit dem fragezecihen sucht er nach dem zeichen vor dem fragezeichen bis es 0 oder 1 mal vorkommt. Das nennt sich Gierig (engl. greedy) und die fragezeichen schalten dies aus. man kann auch nach {minvorkommen, maxvorkommen} suchen, wenn du also {0,1} benutzen würdest hättest du den selben effekt wie das fragezeichen
Datum: 16.06.2006-01:20

|
re: URLs extrahieren hier mein komplettes script
|
Seitenanfang |
| Nun hab ich das auch verstanden. Danke für deine hilfe! Gruß rüdiger
Datum: 16.06.2006-01:35

|
re: URLs extrahieren hier mein komplettes script
|
Seitenanfang |
| Hallo! Ich hätte hier nochmal eine Frage. Ich habe ein Skript geschrieben, das auf nichts anderes machen sollte als solange einen Weiter-Link zu suchen und ihn zu besuchen bis keiner mehr gefunden wird. Wenn keiner mehr gefunden wird soll das Programm abbrechen. So sieht's aus: #!/usr/bin/perl -wuse strict; use LWP::Simple; my @lines; my $next; my $doc; $next = "http://computer.listings.ebay.at/CPUs-Kuehler_Desktop-CPUs_W0QQfromZR4QQsacatZ78769QQsocmdZListingItemList"; my $i=0; while ($doc = get("$next")) { $i++; print "Hole Seite $i $next\n"; $doc =~ s/\n//g; push (@lines, [$1,$2]) while $doc =~ /<td class=\".*?\"><h3 class=\".*?\"><a href=\".*?QQitemZ(.*?)QQ.*?\">(.*?)<\/a><\/h3>.*?<\/td>/g; $doc=~ /<h4 class=\".*?\"><span class=\".*?\"><a href=\"(.*?)\">Weiter<\/a><\/span>/; my $next = $1; $next = "http://computer.listings.ebay.at" . $next; } print "Ende.\n";
Leider funktioniert es nicht. Das Skript ruft immer die erste Seite auf. Ich sitze jetzt schon eine Weile hier und komme nicht drauf wieso. Kann mir bitte jemand weiterhelfen?Danke ruediger
Datum: 16.06.2006-13:37

|
re: URLs extrahieren hier mein komplettes script
|
Seitenanfang |
Hallo ruediger, benutz einfach wieder die regex aus dem script nur ein bisschen verändert:$linkstr =~ s/<a.*?href="(.*?)".*?>Weiter<\/a>?//si $url = $1; und lass diese ganzen td, h4 etc tags raus, die interessieren dich doch nicht. also warum die regex danach suchen lassen? damit läufst du nur gefahr das die bei ebay mal leicht was am code der seite verändern und das ganze nicht merh funktioniert, zudem solltest du prüfen ob die Toplevel domain nicht schon im linktext enthalten ist. wieso willst du dich eigentlich durch ebay quasi "durchklicken"?
Datum: 16.06.2006-13:49

|
re: URLs extrahieren hier mein komplettes script
|
Seitenanfang |
ich habs jetzt so gelöst: #!/usr/bin/perl -wuse strict; use LWP::Simple; my @lines; my $next; my $doc; $next = "http://computer.listings.ebay.at/CPUs-Kuehler_Desktop-CPUs_W0QQfromZR4QQsacatZ78769QQsocmdZListingItemList"; my $i=0; while (1 == 1) { $i++; print "Hole Seite $i $next\n"; $doc = get("$next"); $doc =~ s/\n//g; push (@lines, [$1,$2]) while $doc =~ /<td class=\".*?\"><h3 class=\".*?\"><a href=\".*?QQitemZ(.*?)QQ.*?\">(.*?)<\/a><\/h3>.*?<\/td>/g; $doc=~ /<h4 class=\".*?\"><span class=\".*?\"><a href=\"(.*?)\">Weiter<\/a><\/span>/; last unless $1; $next = "http://computer.listings.ebay.at" . $1; } print "Ende.\n";
wieso ich mich durch ebay durchklicken will: ich möchte die artikel nummern sammeln um nach der auktion weiterhin auf die artikel zugreifen zu können unter anderem um den endpreis zu erfahren. gruß rüdiger
Datum: 16.06.2006-13:58

|
re: URLs aus HTML-Seite extrahieren
|
Seitenanfang |
| Warum macht ihr euch eigentlich die unnötige Arbeit mit regulären Ausdrücken?? Für solche Aufgaben gibt es Module. Hier könnte man z.B. HTML::Parser nehmen (Beispiel findet man im Wiki von perl-Community.de) oder URI::Find Dokus und Module sind auf http://search.cpan.org zu finden...
Datum: 19.06.2006-13:44

|
re: URLs aus HTML-Seite extrahieren
|
Seitenanfang |
| warum machst du dir die unnötige Arbeit lädst module runter, und liest dir lange anleitungen durch, wenn diese auf dem Server wahrscheinlich eh nicht vorhandne sind und eine einzelne zeile regex es auch tut?
Datum: 19.06.2006-13:48

|
re: URLs aus HTML-Seite extrahieren
|
Seitenanfang |
| Was machst Du wenn auf einmal die Tags groß geschrieben werden oder statt der " auf einmal ' verwendet werden? Warum benutzt Du das Replacement und nicht das simple pattern matching? warum sollte ich mir die Arbeit machen und das Rad neu erfinden, bei dem ich bei jeder kleinen Änderung am Quelltext das ganze Programm anpassen muss? Meine Kunden möchten, dass die Software stabil läuft und nicht alle paar Wochen irgendwie angepasst werden muss. Die Module sind lang erprobt und stabil. Sie erleichtern meine Arbeit ungemein. Sie machen meine Programme leicht wartbar und Module sind wiederverwendbar. Ich muss bei Regexen nicht darauf achten, ob sie jetzt Greedy sein dürfen/müssen/sollen oder nicht. Die Installation ist schnell geschehen wenn das Modul nicht zum CORE gehört...
Datum: 20.06.2006-09:18

|
re: URLs aus HTML-Seite extrahieren
|
Seitenanfang |
| warum sollte ich mir die Arbeit machen und das Rad neu erfinden ^^^^^^^^^^^^^^^^^^^ warum tun Dunlop, Hankook etc. das die ganze zeit, wenn die alten räder doch genau so gut sind wie die neuen? klingelts?
Datum: 20.06.2006-10:50

|
re: URLs aus HTML-Seite extrahieren
|
Seitenanfang |
Hallo Die grossen Reifenhersteller sind die Fachleute für Reifen, klar, die entwickeln weiter. Die Module auf CPAN werden auch von Spitzenleuten gemacht und weiterenwickelt. Wenn du dich zu den Fachleuten zählst, ja, dann solltest auch du für die Gemeinschaft oder die dicke Kohle weiterentwickeln. Wenn du aber kein absoluter Fachmann für Perl bist nimmst du besser das was dir die Profis anbieten. Schneidest du in die Reifen deines Autos dein eigenes Profil, da Michelin das auch macht? Gruss Kristian
Datum: 21.06.2006-07:53

|
re: URLs aus HTML-Seite extrahieren
|
Seitenanfang |
| Dunlop etc. _verbessern_ ihre Reifen und versuchen nicht nochmal beim Holzrad anzufangen. Eine Regexp für diese Aufgabe zu verwenden ist sogar noch vor dem Holzrad - na klingelt's?
Datum: 22.06.2006-13:44

|
re: URLs aus HTML-Seite extrahieren
|
Seitenanfang |
| Sieh es wie du willst, ich nehm mir jetzt meine Kuele und geh auf die Jagd. Tatonka!
Datum: 22.06.2006-14:02

|