Torbjørn Skrevet 7. desember 2003 Del Skrevet 7. desember 2003 (endret) Det er kanskje litt tidlig å gå inn på spesialiserte ting som dette, men det er noe som er relevant å bruke perl til og sikkert interessant selvom en del av funksjonene ligger litt over hodet på de fleste nybegynnere. Del A: # --------------------- # Laste ned WWW-sider # --------------------- # Til dette brukes lettest modulen LWP::Simple eks. slik: #!/usr/bin/perl use LWP::Simple; $html = get("http://www.vg.no"); # $html inneholder nå all HTML kode fra vg. # skriver den ut som "bevis" print $html; LWP::Simple egner seg perfekt for å bare laste ned html sider fra linker angitt. Del B: # --------------------- # Parse HTML sider # --------------------- # Så begynner parsinga. Til det bruker vi HTML::TokeParser, som følger med de fleste perl distroer. #!/usr/bin/perl $url = 'http://www.vg.no'; use LWP::Simple; use HTML::TokeParser; $html = get $url; # det ovenfor er stort sett som før. # dette er nytt stuff: $parser = new HTML::TokeParser \$html; # lager et parserobjekt. # alternativt kan det skrives slik: $parser = HTML::TokeParser->new(\$html); # verd å merke seg at den tar en referanse til en streng som argument, derfor # \$html istedet for $html # vi vil nå skrive ut alle bilder som ligger på vg's framside: # å bruke HTML::TokeParser kan ligne litt på å lese i fra en file handle. # vi bruker en while løkke for å hente ut alle bilder: # lager en array for å samle opp bildene. @bilder = (); # henter ut en og en <img> tag. while( $img = $parser->get_tag("img")){ $counter++; # denne er ikke så grei å skjønne, men den fungerer! $img_src = $img->[1]{src}; # hvis <img> har flere attributter enn src, kan de også hentes ut # på lignende måte: $img->[1]{et_eller_annet} # eks: "width", "height", "alt", etc... # lagrer src'en i array en vår: push @bilder, $img_src; } # til slutt et lite summary: print "Det er ",scalar @bilder," bilder på $url\n"; print "Trykk enter for å liste dem ut.\n"; # lese en linje som vi ikke gjør noe mer med. <STDIN>; print join "\n", @bilder; print "\n"; Endret 7. desember 2003 av Torbjørn Lenke til kommentar
Torbjørn Skrevet 7. desember 2003 Forfatter Del Skrevet 7. desember 2003 (endret) Hvis du kjører programmet, vil du se at det er mange små <img> tagg'er som ikke er så interessange. Ved nærmere inspeksjon, kan det set ut som om bilder på framsiden heter noe med: http://www.vg.no/grafikk/frontbilder/73283.jpg så... vi kan hente ut bare de bildene som heter noe med dette f.eks. # ...fortsetter fra koden ovenfor. # kan vurdere å slette print join "\n",@bilde; # vi bruker grep for å hente ut elementer som matcher et bestemt mønster: @framsidebilder = grep m|http://www.vg.no/grafikk/frontbilder/| , @bilder; print "Det ser ut til å være ", scalar @framsidebilder, " framsidebilder på VG.\n"; print "Trykk enter.\n"; <STDIN>; print join "\n",@framsidebilder; print "\n"; Endret 7. desember 2003 av Torbjørn Lenke til kommentar
daysleper Skrevet 7. desember 2003 Del Skrevet 7. desember 2003 Kanskje du kunne kunne skrevet en guide på sourcecode.no om alt dette? Vi trenger flere som kan skrive. Vi er bare 3 som skriver nå, og 2 av oss er midt opp i eksamen. Bare et forslag så klart. Lenke til kommentar
Torbjørn Skrevet 7. desember 2003 Forfatter Del Skrevet 7. desember 2003 det gjør ikke så mye mer interessant, men det viser hvordan man meget enkelt kan finne alt av en spesiell tag. på en HTML side. Hvis noen har forslag til ting som trenger å hentes fra nett, så post her, så kanskje det kan løses i fellesskap. Lenke til kommentar
Torbjørn Skrevet 7. desember 2003 Forfatter Del Skrevet 7. desember 2003 har eksamen jeg og, dette er bare for å snike meg unna lesinga. referer gjerne til poster her, eller copy paste dem til en bedre løsning. Lenke til kommentar
moesen Skrevet 7. desember 2003 Del Skrevet 7. desember 2003 Ikke for og være vanskelig eller masete men: Kan du ikke forklare litt mer om LWP::Simple og HTML::TokeParser ? print "Det ser ut til å være ", scalar @framsidebilder, " framsidebilder på VG.\n"; Hvorfor ikke bare print "Det ser ut til å være, scalar @framsidebilder, framsidebilder på VG.\n"; ..? print join "\n",@framsidebilder; Hva er/gjør join? Lenke til kommentar
Torbjørn Skrevet 7. desember 2003 Forfatter Del Skrevet 7. desember 2003 scalar er en funksjon. hvis du skriver en funksjon inne i en streng vil den ikke utføres, da får du bare skrevet ut funksjonsnavnet som om det var bokstaver. join brukes for å slå sammen en liste. eks slik: @array = (1, 2, 3, 4, 5, 6); $streng = join ":", @array; # $streng = "1:2:3:4:5:6" join "\n",@array, vil lage en streng med alle elementer adskilt med linjeskift, noe som egner seg fint for å skrive ut alle elementene med ett element på hver linje. se forøvrig: perltutorail #7 og seksjonen: # ---------------------------- # # arrays til og fra strenger # # ---------------------------- # Lenke til kommentar
Torbjørn Skrevet 7. desember 2003 Forfatter Del Skrevet 7. desember 2003 eh... angående det første problemet, se på det slik: $streng1 = "Det ser ut til å være "; $streng2 = scalar @framsidebilder; $streng3 = " framsidebilder på VG.\n"; print $streng1, $streng2, $streng3; merk at "scalar" her strengt tatt ikke var nødvendig å ha med, det ville gått uten fordi perl skjønner at du her vil ha scalar verdien av en array (som er == antallet) men ikke tenk for mye på det! Lenke til kommentar
Torbjørn Skrevet 7. desember 2003 Forfatter Del Skrevet 7. desember 2003 (endret) Litt mer om LWP::Simple: "use LWP::Simple" vil medføre at du får en funksjon tilgjengelig, "get", som kan brukes for å hente ut en www-adresse og legge innholdet i en variabel. hvilket er det jeg gjør her. videre innfører den også funksjonene: head($url) Get document headers. Returns the following 5 values if successful: ($content_type, $document_length, $modified_time, $expires, $server) Returns an empty list if it fails. In scalar context returns TRUE if successful. getprint($url) Get and print a document identified by a URL. The document is printed to STDOUT as data is received from the network. If the request fails, then the status code and message are printed on STDERR. The return value is the HTTP response code. getstore($url, $file) Gets a document identified by a URL and stores it in the file. The return value is the HTTP response code. mirror($url, $file) Get and store a document identified by a URL, using If-modified- since, and checking the Content-Length. Returns the HTTP response code. Endret 7. desember 2003 av Torbjørn Lenke til kommentar
Torbjørn Skrevet 7. desember 2003 Forfatter Del Skrevet 7. desember 2003 HTML::TokeParser lar deg parse et html dokument. hvis du ser av koden øverst, ser du at jeg lager et parser-objekt som jeg siden kaller på. denne parseren kan jeg så kalle get_tag funksjonen på, for å hoppe til neste forekomsten av en angitt tag. funksjonen get_token hopper til neste tag eller kommentar eller tekst. hvis det ikke finnes flere tags eller tokens, returnerer den undef (perl'sk for "false"), og det bruker jeg til å hoppe ut av while-loopen og gå videre i programmet. Lenke til kommentar
moesen Skrevet 8. desember 2003 Del Skrevet 8. desember 2003 Cpan er praktisk. Gjorde ett lite søk å fant litt om LWP::Simple og HTML::TokeParser. Go Cpan Lenke til kommentar
Torbjørn Skrevet 8. desember 2003 Forfatter Del Skrevet 8. desember 2003 moesen: her skal du få se noe enda mer praktisk! skriv: perldoc LWP::Simple på kommandolinja. (hvis du installerte den) Lenke til kommentar
moesen Skrevet 8. desember 2003 Del Skrevet 8. desember 2003 moesen: her skal du få se noe enda mer praktisk! skriv: perldoc LWP::Simple på kommandolinja. (hvis du installerte den) $ perldoc LWP::SimpleNo documentation found for "LWP::Simple". Må jeg instalere, hvordan? Lenke til kommentar
Torbjørn Skrevet 8. desember 2003 Forfatter Del Skrevet 8. desember 2003 enda lettere; som root: perl -MCPAN -e shell du får nå opp et interaktivt shell. her har du noen enkle kommandoer tilgjengelige, mest interessant er: install LWP::Simple eller install et annet Modul::Navn du evt måtte ha hørt om. for å søke etter noe: i /søkeord/ Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå