Gå til innhold

Anbefalte innlegg

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 av Torbjørn
Lenke til kommentar
Videoannonse
Annonse

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 av Torbjørn
Lenke til kommentar

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

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

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

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 av Torbjørn
Lenke til kommentar

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

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...