Web Links aus einer Webseite/Textdatei filtern / WGET

S

shakky4711

DOS-FAN
Hallo,

ich möchte Updates für den AVG Virenscanner für Rechner die nicht am Internet hängen vollautomatisch von der AVG Webseite laden http://free.grisoft.com/doc/24/us/frt/0

Alle Versuche direkt mit WGET zum Erfolg zu kommen sind gescheitert. So habe ich den Umweg angedacht zuerst mittels wget diese Webseite lokal runterzuladen und mit durch eine grep Suche nach "*.bin" dieses Ergebnis erzeugt:

href="http://free.grisoft.com/softw/70free/update/u7setup4869i.bin" onclick="return fc_click('dwn_u7set
/></td><td class="norm"><a class="dwnprg" href="http://free.grisoft.com/softw/70free/update/u7avi1296u12936p.bin"
lass="norm"><a class="dwnprg" href="http://free.grisoft.com/softw/70free/update/u7iavi14006p.bin" onclick="return fc_click('dwn_u7i
ss="norm"><a class="dwnprg" href="http://free.grisoft.com/softw/70free/update/u7f524ov.bin" onclick="return fc_click('dwn_u7f524ov.
ss="norm"><a class="dwnprg" href="http://free.grisoft.com/softw/70free/update/u7setup510ow.bin"

Wie kann ich jetzt mit SED oder AWK die Liste zu "nur-Webadressen" zusammenschrumpfen lassen um diese dann an WGET zu übergeben? So stelle ich mir das Ergebnis vor:

http://free.grisoft.com/softw/70free/update/u7f524ov.bin
http://free.grisoft.com/softw/70free/update/u7setup510ow.bin
http://free.grisoft.com/softw/70free/update/u7lxinit11t.bin

Oder gibt es doch eine einfachere Lösung und ich habe mich nur in etwas verrannt?

Vielen Dank für Eure Hilfe.
 
Also ich finde das ganze mit Perl viel einfacher zu lösen, hier ein Script der dir alles abnehmen sollte:
Code:
#!/usr/bin/perl
use strict;
use LWP::UserAgent;

#Url ersetzen:
my $url = 'http://www.google.de/';

#Neuen LWP::UserAgent initialisieren
my $agent = LWP::UserAgent->new();

#Http request absetzten
my $request = HTTP::Request->new('GET', $url);

#Antwort holen
my $response = $agent->request($request);

#Fehler ausklammern
if ( $response->is_error() ) { 
        print "Code:        : ", $response->code() ,    "\n";
        print "Fehlermeldung:  ", $response->message() , "\n";	
}
else {
	$_ = $response->content();
	while (/(http\:\/\/free\.grisoft\.com\/softw\/70free\/update\/.*?\.bin)/g) { 
        print "$&\n"; 
        #oder z.B. system("wget $&"); zum downloaden
        }
}

Du musst nur oben die url in die url variable eintragen.
Du brauchst libwww für perl um das auszuführen weil ich ja damit den Quelltext lade.
 
Super, vielen Dank, hat genauso geklappt wie es sollte!
 
könnt mir einer mal helfen ?

ich bräuchte das für einen datei-input, also die html ist lokal gespeichert...
und ich krieg das mit open nicht gebacken....

und wenns nicht zuviel ausmacht, wie ich vielleicht auch gleich noch ein teil ersetzen kann, also wie sed 's/alt?=bla/neu/g'
 
Zuletzt bearbeitet:
Code:
perl -nle 'print $& if /linkregex/' infile.html
$& ist die match-Variable. Siehe dazu auch
Code:
perldoc perlvar|less -p '\$\&'
Für sed-like Ersetzungen:
Code:
perl -pe 's/fooregex/bar/'

Für die cli-Switches (wenns dich denn interessiert) siehe
Code:
perldoc perlrun
 
perl.exe -nle 'print $& if /linkregex/' liste.txt
"liste.txt" ist syntaktisch an dieser Stelle nicht verarbeitbar.

Windows ? :)
.
.
.
EDIT (autom. Beitragszusammenführung) :
.

und unter linux kommt nichts...

ab@NIX:~$ perl -nle 'print $& if /linkregex/' liste.txt
ab@NIX:~$
 
Zuletzt bearbeitet:
"liste.txt" ist syntaktisch an dieser Stelle nicht verarbeitbar.
Wie bitte? liste.txt muss keiner Syntax genügen. Wovon redest du?

Plenken und offtopic? Oha.

Ich weiß ja nicht was du mir mit deinem Post sagen willst, aber wenn du in windows unterwegs bist musst du wahrscheinlich einfach aus den single-quotes double-quotes machen. (Afair, cmd.exe quoting wird sicherlich irgendwo dokumentiert sein.)
Wenn du's nicht auf der cli hinbekommst, hier ist das Ganze mal als "richtiges Skript": (nicht exakt "übersetzt", aber sinngemäß)
Code:
use strict; use warnings;

while (my $line = <>) {
    print $& if $line =~ /linkregex/;
}
Das andere s/foo/bar/ Skript lässt sich so formulieren:
Code:
while (<>) {s/fooregex/bar; print}
(Bin grade schreibfaul. Was das ganze macht kannst du ja mittels perldoc (sollte es auch in windows geben) nachlesen.)

edit:
und unter linux kommt nichts...

ab@NIX:~$ perl -nle 'print $& if /linkregex/' liste.txt
ab@NIX:~$
[ ] Du hast die von mir verwendete Abstraktion "linkregex" verstanden.
 
[ ] Du hast die von mir verwendete Abstraktion "linkregex" verstanden.

nein, da hats grad jetzt erst klick gemacht :)

und ja ich war unter Windows unterwegs, was ich erhofte mit der perl.exe gezeigt zu haben :)


aber so ganz krieg ichs immer noch nicht auf die reihe....

Code:
cat liste.txt | perl -nle 'print $& if /http\:\/\/*?\.jpg/'

müsste mir doch alles listen was mit http anfängt und jpg aufhört, oder ?
 
Code:
/http\:\/\/*?\.jpg/
[...]
müsste mir doch alles listen was mit http anfängt und jpg aufhört, oder ?
Nein. Der Asterisk (*) ist ein Quantifier. Ein Quantifier gibt an wie oft das vorangehende Atom vorkommen soll/kann. In diesem Fall quantifiziert dein Asterisk den (escapten) Slash. Das Fragezeichen macht das matching-Verhalten vom Asterisk non-greedy. Das Ende ".jpg" bedeutet "irgendein Zeichen gefolgt von jpg", was du wahrscheinlich nicht willst. (Edit: Schwachfug, der Punkt ist ja escaped.)
Das wolltest du wahrscheinlich:
Code:
m{http://.+?[.]jpg}

Btw UUOC.
 
Zuletzt bearbeitet:
jippi, genau, wenn man vom syntax halt null Ahnung hat :)

also einen link hab ich dann schon mal, jedoch stehen alle in einer zeile, ohne Umbruch, ich hab so das gefühl, da hast du auch noch ne Lösung :)
 
Code:
perl -nle 'print $& while m{http://.+?[.]jpg}g' infile.html > out.links
.

edit:
simpler und schneller:
Code:
perl -nle 'print for m{http://.+?[.]jpg}g' infile.html > out.links
 
Zuletzt bearbeitet:
Zurück
Oben