perlunity.de - PERL | JAVASCRIPT | PHP | MySQL | APACHE



#!/COMMUNITY

Members: 5374
davon online: 1
weitere User: 31
Click for quality!




11.02.2012 / 17:42

Community-Member werden   |   Paßwort vergessen   |   OnlineMonitor (1) Wer ist online ... OnlineMonitor starten !
     

 

Home


PERLscripts


PHPscripts


JAVAscripts


Hilfreiches


Links2www


Newscenter


Community


Interna




Community  »  Perl: Allgemeines Forum zur Themenübersicht Themensuche Themenansicht in Thread-Modus


BeitragURLs 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

Beitragre: 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

Beitragre: URLs aus HTML-Seite extrahieren
Seitenanfang
Funktioniert leider nicht.

#!/usr/bin/perl -w

use 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

Beitragre: 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

Beitragre: URLs aus HTML-Seite extrahieren
Seitenanfang
Funzt aucht nicht denn ich brauche alle Links nicht nur 1.

Datum: 16.06.2006-00:45

Beitragre: 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

Beitragre: 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

Beitragre: 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

Beitragre: 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

Beitragre: 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 -w

use 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

Beitragre: 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

Beitragre: URLs extrahieren hier mein komplettes script
Seitenanfang
ich habs jetzt so gelöst:


#!/usr/bin/perl -w

use 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

Beitragre: 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

Beitragre: 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

Beitragre: 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

Beitragre: 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

Beitragre: 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

Beitragre: 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

Beitragre: 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

-






-
-