/ Forside / Teknologi / Udvikling / Perl / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Perl
#NavnPoint
bjarneA 141
poul_from 50
soccer 30
Nicknack 14
Tmpj 0
http perl modul ?
Fra : F.Larsen


Dato : 09-03-01 23:35

Hej

Hvilket perl modul skal man benytte for at grabbe html sider fra et (andet)
website ind i en perl variabel ?

--
Flemming

Q2 3D Benchmarks: http://www.ClanWorld.dk/Q2Bench/
Støjdæmp din PC ..: http://hjem.get2net.dk/Quake2/LowNoise/




 
 
Poul-Erik Andreasen (10-03-2001)
Kommentar
Fra : Poul-Erik Andreasen


Dato : 10-03-01 05:07

"F.Larsen" wrote:
>
> Hej
>
> Hvilket perl modul skal man benytte for at grabbe html sider fra et (andet)
> website ind i en perl variabel ?

LWP::Simple


--
Med venlig hilsen Poul-Erik Andreasen

F.Larsen (19-03-2001)
Kommentar
Fra : F.Larsen


Dato : 19-03-01 18:05

Hej igen

Det lykkedes så at grappe en side. Jeg har nu lavet en lille tilstandsmaskine der
kan finde links.
My problem er nu af få komponeret et regulært udtryk der kan grabbe linken
korrekt.
Mon ikke der er nogen der har løst det før mig ?

Den skal kunne klare dobbelt citationstegn, enkeltcitaionstegn eller ingen ("|'|)
samt forward / eller \ i url + diverse whitepace. (Selv om dette ikke er korrekt
html syntaks så ses det ret tit)

<A HREF="url">urltext</A>
<A HREF='url'>urltext</A>
<A HREF='url'>urltext</A>
=> url

--
Flemming

Q2 3D Benchmarks: http://www.ClanWorld.dk/Q2Bench/
Støjdæmp din PC ..: http://hjem.get2net.dk/Quake2/LowNoise/

"Poul-Erik Andreasen" <poulerik@worldonline.dk> wrote in message
news:3AA9A850.586B08F7@worldonline.dk...
> "F.Larsen" wrote:
> >
> > Hej
> >
> > Hvilket perl modul skal man benytte for at grabbe html sider fra et (andet)
> > website ind i en perl variabel ?
>
> LWP::Simple




Trond Michelsen (19-03-2001)
Kommentar
Fra : Trond Michelsen


Dato : 19-03-01 19:40

F.Larsen <N0Spam@usa.net> skrev i
meldingsnyheter:I_qt6.13793$44.947544@news010.worldonline.dk...
> Hej igen
>
> Det lykkedes så at grappe en side. Jeg har nu lavet en lille
tilstandsmaskine der
> kan finde links.
> My problem er nu af få komponeret et regulært udtryk der kan grabbe linken
> korrekt.

Ja. Det er vanskelig å lage et enkelt regulært uttrykk som får til dette på
all mulig HTML.

Har du vurdert HTML::LinkExtor ?

Fra perldoc HTML::LinkExtor:
-------------------8<-------------------
EXAMPLE
This is an example showing how you can extract links from a
document received using LWP:

use LWP::UserAgent;
use HTML::LinkExtor;
use URI::URL;

$url = "http://www.sn.no/"; # for instance
$ua = new LWP::UserAgent;

# Set up a callback that collect image links
my @imgs = ();
sub callback {
my($tag, %attr) = @_;
return if $tag ne 'img'; # we only look closer at <img ...>
push(@imgs, values %attr);
}

# Make the parser. Unfortunately, we don't know the base yet
# (it might be diffent from $url)
$p = HTML::LinkExtor->new(\&callback);

# Request document and parse it as it arrives
$res = $ua->request(HTTP::Request->new(GET => $url),
sub {$p->parse($_[0])});

# Expand all image URLs to absolute ones
my $base = $res->base;
@imgs = map { $_ = url($_, $base)->abs; } @imgs;

# Print them out
print join("\n", @imgs), "\n";
-------------------8<-------------------


Hvordan man endrer koden til å sjekke <a ...> istedet for <img ...> er
utelatt med vilje

Jeg kan godt komme med et forslag til regex hvis du absolutt vil, men dette
er en langt mer robust løsning.

--
Trond Michelsen





F.Larsen (19-03-2001)
Kommentar
Fra : F.Larsen


Dato : 19-03-01 21:36

Hej Trond

interresant modul, men det løse ikke helt opgaven da jeg også vil gemme link
teksten (den del af opgaven _er_ klaret).
Jeg laver en split på "<A" herefter vil alle strenge som jeg er interretseret i
starte med "HREF ...". Der går dog kludder i det når jeg skal specificere de
forskellige former for citationstegn (" | ' |) i mit regexpr da jeg bruger $+ til
at trække matchen ud.


--
Flemming

Q2 3D Benchmarks: http://www.ClanWorld.dk/Q2Bench/
Støjdæmp din PC ..: http://hjem.get2net.dk/Quake2/LowNoise/

"Trond Michelsen" <trondmm-usenet@crusaders.no> wrote in message
news:post6.8526$8c.936371@news01.chello.no...
> F.Larsen <N0Spam@usa.net> skrev i
> meldingsnyheter:I_qt6.13793$44.947544@news010.worldonline.dk...
> > Hej igen
> >
> > Det lykkedes så at grappe en side. Jeg har nu lavet en lille
> tilstandsmaskine der
> > kan finde links.
> > My problem er nu af få komponeret et regulært udtryk der kan grabbe linken
> > korrekt.
>
> Ja. Det er vanskelig å lage et enkelt regulært uttrykk som får til dette på
> all mulig HTML.
>
> Har du vurdert HTML::LinkExtor ?
>
> Fra perldoc HTML::LinkExtor:




Thorbjoern Ravn Ande~ (20-03-2001)
Kommentar
Fra : Thorbjoern Ravn Ande~


Dato : 20-03-01 10:12

On Mon, 19 Mar 2001, F.Larsen wrote:

> Hej Trond
>
> interresant modul, men det løse ikke helt opgaven da jeg også vil gemme link
> teksten (den del af opgaven _er_ klaret).
> Jeg laver en split på "<A" herefter vil alle strenge som jeg er interretseret i
> starte med "HREF ...". Der går dog kludder i det når jeg skal specificere de
> forskellige former for citationstegn (" | ' |) i mit regexpr da jeg bruger $+ til
> at trække matchen ud.

Jævnfør FAQ'en (perldoc -q html) så er en god måde at dissekere HTML-filer
på, at benytte HTML::Parse modulet fra CPAN.

Hvis du vil gøre det med en regexp og dine HTML-filer er regulære nok
(hvilket de kun er hvis du selv har genereret dem) så overvej noget i stil
med:

Indlæs hele filen i strengen. Lav ikke-grådig (vigtigt) søgning på <A
.... HREF=("|')(.*)("|') og udtræk den passende $nummer der svarer til din
parantes. Der er naturligvis et problem med gåseøjne inden i apostroffer
og omvendt, men det gælder jo kun hvis du ikke selv har genereret filerne.

Alternativt kan du benytte TIdy eller JTidy til at konvertere din fil til
pæn XML, og herefter benytte et XSLT værktøj til at trække din information
ud. Det vil i så¨fald se således ud:

<xsl:template match="A">
Tag "<xsl:value-of select="."/>" peger på </xsl:value-of select="@HREF"/>
</xsl:template>

God fornøjelse.
--
Thorbjørn Ravn Andersen
http://unixsnedkeren.dk



Trond Michelsen (20-03-2001)
Kommentar
Fra : Trond Michelsen


Dato : 20-03-01 17:28


"F.Larsen" <N0Spam@usa.net> wrote in message
news:k4ut6.14932$44.1001364@news010.worldonline.dk...
> Hej Trond
>
> interresant modul, men det løse ikke helt opgaven da jeg også vil
gemme link
> teksten (den del af opgaven _er_ klaret).

Hvor mye av linkteksten vil du ha?

<a href="link"><font face="helvetica"><b>linktekst</b></font></a>

vil du ha med <font> og <b> også, eller vil du bare ha "linktekst"?

anyway - kjapt eksempel med HTML::Parser (versjon 3), som bare tar vare
på "linktext", ikke tagger i <a>


------------------8<------------------
#!/usr/bin/perl -w

use HTML::Parser ();

my $filename = shift;
my ($link, $in_a);

my $p = HTML::Parser->new(
api_version => 3,
start_h => [\&start, "tagname, attr"],
text_h => [\&text, "dtext"],
end_h => [\&end, "tagname"],
);

$p->parse_file($filename);

sub start {
my ($tagname, $attr) = @_;
return unless $tagname eq 'a';

$in_a = 1;
$link = $attr->{href};
}

sub text {
my ($text) = @_;
return unless $in_a;
for ($text) {
s/^\s*//;
s/\s*$//;
}
print $link, " => ", $text, "\n";
}

sub end {
my ($tagname) = @_;
return unless $tagname eq 'a';

$in_a = 0;
$link = '';
}
------------------8<------------------


--
Trond Michelsen




Trond Michelsen (20-03-2001)
Kommentar
Fra : Trond Michelsen


Dato : 20-03-01 18:19


"Trond Michelsen" <mike@crusaders.no> wrote in message
news:FxLt6.2686$mh4.170933@news3.oke.nextra.no...

Hmm, jeg må nok komme med en liten patch her...

> my ($link, $in_a);

endres til:

my ($link, $in_a, $content);

og

> ------------------8<------------------
> sub text {
> my ($text) = @_;
> return unless $in_a;
> for ($text) {
> s/^\s*//;
> s/\s*$//;
> }
> print $link, " => ", $text, "\n";
> }
>
> sub end {
> my ($tagname) = @_;
> return unless $tagname eq 'a';
>
> $in_a = 0;
> $link = '';
> }
> ------------------8<------------------

endres til:

------------------8<------------------
sub text {
my ($text) = @_;
return unless $in_a;

$content .= $text;
}

sub end {
my ($tagname) = @_;
return unless $tagname eq 'a';

for ($content) {
s/^\s*//;
s/\s*$//;
}
print $link, " => ", $content, "\n";

$in_a = 0;
$link = '';
$content = '';
}
------------------8<------------------

Nå blir det litt enklere å legge til støtte for å ta vare på alle tagger
innenfor <a> også.

Hvis du vil ta vare på alle linkene istedet for å printe de ut direkte,
er det bare å endre denne linjen:

print $link, " => ", $content, "\n";

til noe slikt:

push @links, {url => $link, text => $content};

så kan du gjøre hva du vil med @links senere.

--
Trond Michelsen




Trond Michelsen (20-03-2001)
Kommentar
Fra : Trond Michelsen


Dato : 20-03-01 18:34

"Trond Michelsen" <mike@crusaders.no> wrote in message
news:mhMt6.2702$mh4.172745@news3.oke.nextra.no...
> Hmm, jeg må nok komme med en liten patch her...

Huffda... Enda en patch på gang :)


> ------------------8<------------------
> sub start {
> my ($tagname, $attr) = @_;
> return unless $tagname eq 'a';
>
> $in_a = 1;
> $link = $attr->{href};
> }
> ------------------8<------------------

endres til:

------------------8<------------------
sub start {
my ($tagname, $attr) = @_;

if ($tagname eq 'a') {
$in_a = 1;
$link = $attr->{href};
} elsif ($in_a) {
if ($tagname eq 'img') {
$content .= $attr->{alt} ? " [$attr->{alt}] " : " [IMAGE] ";
}
}
}
------------------8<------------------

Så får du linktekst også på linker som bare inneholder <img>-tagg.

--
Trond Michelsen




e96mani@yahoo.dk (20-03-2001)
Kommentar
Fra : e96mani@yahoo.dk


Dato : 20-03-01 12:04

hej,

"F.Larsen" <N0Spam@usa.net> wrote in message
news:I_qt6.13793$44.947544@news010.worldonline.dk...
> Hej igen
>
> Det lykkedes så at grappe en side. Jeg har nu lavet en lille
tilstandsmaskine der
> kan finde links.
> My problem er nu af få komponeret et regulært udtryk der kan grabbe linken
> korrekt.
> Mon ikke der er nogen der har løst det før mig ?
>

hvis du ikke vil bruge de mange gode modules der kan gøre den slags for dig.
så kan du selv opbygge din egen regex (kriterier). hvis man selv gøre det så
kan det altså godt se skræmmende ud. men
her har jeg startet på en der kan udtræk url samt dens text:

#!/usr/bin/perl -w

$test[0] = '<a href = "url1"> url 1</aa>';
$test[1] = "<a href='url2' > <xx> url </xx> 2</a>";
$test[2] = '<a href=url3> url 3</a /a>';
for ( $i = 0 ; $i < 3 ; $i++ ) {
print "URL's text: <$4> \t URL => $3\n"
if $test[$i] =~
m{(<a([^>](?: +)?href ?= ?(\S+ ?)>)((?:[^<]|<[^/]|</[^a])*)</a)}i;
}
exit;

som giver det du vil have, men du skal være opmærksom på at den imødekommer
ikke alle links på en html side. det var lige de kriterier jeg kunne komme
på her og nu. derfor vil jeg råde dig til at bruge de html parser der
findes!






-bb-



F.Larsen (20-03-2001)
Kommentar
Fra : F.Larsen


Dato : 20-03-01 19:27

Tak for svaret ;=)

den her var dog lige hvad jeg havde bruge for :
=~ m{(<a([^>](?: +)?href ?= ?(\S+ ?)>)((?:[^<]|<[^/]|</[^a])*)</a)}i;

hvordan kan det være at den ikke skal være udtrykket ikke skal være omsluttet af /
/ ?

--
Flemming

> hvis du ikke vil bruge de mange gode modules der kan gøre den slags for dig.
> så kan du selv opbygge din egen regex (kriterier). hvis man selv gøre det så
> kan det altså godt se skræmmende ud. men
> her har jeg startet på en der kan udtræk url samt dens text:
>
> #!/usr/bin/perl -w
>
> $test[0] = '<a href = "url1"> url 1</aa>';
> $test[1] = "<a href='url2' > <xx> url </xx> 2</a>";
> $test[2] = '<a href=url3> url 3</a /a>';
> for ( $i = 0 ; $i < 3 ; $i++ ) {
> print "URL's text: <$4> \t URL => $3\n"
> if $test[$i] =~
> m{(<a([^>](?: +)?href ?= ?(\S+ ?)>)((?:[^<]|<[^/]|</[^a])*)</a)}i;
> }
> exit;
>
> som giver det du vil have, men du skal være opmærksom på at den imødekommer
> ikke alle links på en html side. det var lige de kriterier jeg kunne komme
> på her og nu. derfor vil jeg råde dig til at bruge de html parser der
> findes!
>
>
>
>
>
>
> -bb-
>
>



Thomas Jespersen (20-03-2001)
Kommentar
Fra : Thomas Jespersen


Dato : 20-03-01 19:33

"F.Larsen" <N0Spam@usa.net> writes:

> hvordan kan det være at den ikke skal være udtrykket ikke skal være
> omsluttet af /

Fordi "m" operatoren bliver brugt. Kig på afsnittet "Quote and
Quote-Like operators" i perlop

Trond Michelsen (20-03-2001)
Kommentar
Fra : Trond Michelsen


Dato : 20-03-01 19:40

> den her var dog lige hvad jeg havde bruge for :
> =~ m{(<a([^>](?: +)?href ?= ?(\S+ ?)>)((?:[^<]|<[^/]|</[^a])*)</a)}i;
>
> hvordan kan det være at den ikke skal være udtrykket ikke skal være
omsluttet af /
> / ?

Mange perl-operatorer har valgfrie quote-tegn

s/search/replace/;
m#search#;
qq{doublequoted};
q,singlequote,;
qr¤regex¤;
tr[a-z][A-Z];
y<a-z><A-Z>;

osv.


I dette tilfellet kunne
m{(<a([^>](?: +)?href ?= ?(\S+ ?)>)((?:[^<]|<[^/]|</[^a])*)</a)}i;
vært skrevet som
m/(<a([^>](?: +)?href ?= ?(\S+ ?)>)((?:[^<]|<[^\/]|<\/[^a])*)<\/a)/i;

Men det er greit å slippe å backslashe alle slasher hele tiden.

--
Trond Michelsen



F.Larsen (20-03-2001)
Kommentar
Fra : F.Larsen


Dato : 20-03-01 21:58

Trond Michelsen" <mike@crusaders.no> wrote in message
news:sCNt6.2740$mh4.177447@news3.oke.nextra.no...
> > den her var dog lige hvad jeg havde bruge for :
> > =~ m{(<a([^>](?: +)?href ?= ?(\S+ ?)>)((?:[^<]|<[^/]|</[^a])*)</a)}i;
> >
>
>
> I dette tilfellet kunne
> m{(<a([^>](?: +)?href ?= ?(\S+ ?)>)((?:[^<]|<[^/]|</[^a])*)</a)}i;
> vært skrevet som
> m/(<a([^>](?: +)?href ?= ?(\S+ ?)>)((?:[^<]|<[^\/]|<\/[^a])*)<\/a)/i;
>
> Men det er greit å slippe å backslashe alle slasher hele tiden.

ah ha - derfor ;=)

Jeg tar en bid af gangen - den er sku lidt sej den der regexp faq ;=)

--
Flemming
still "gumling"

Q2 3D Benchmarks: http://www.ClanWorld.dk/Q2Bench/
Støjdæmp din PC ..: http://hjem.get2net.dk/Quake2/LowNoise/





e96mani@yahoo.dk (21-03-2001)
Kommentar
Fra : e96mani@yahoo.dk


Dato : 21-03-01 05:43

"F.Larsen" <N0Spam@usa.net> wrote in message
news:uhNt6.18019$44.1212562@news010.worldonline.dk...
> Tak for svaret ;=)

selv tak,

[...]
> hvordan kan det være at den ikke skal være udtrykket ikke skal være
omsluttet af /
> / ?

perl giver en muligheden for at selv vælge den søg deling (på perl-sprog
"match-operand delimiter"), altså alle disse søg operationer er ens:

m/find/;
m?find?;
m,find,;
m<find>;
etc....

det er kun spørgsmål om smag og behag, for hvilken del-sæt man vil bruge.
håber at det har hjulpet.



Peter Makholm (21-03-2001)
Kommentar
Fra : Peter Makholm


Dato : 21-03-01 07:40

<e96mani@yahoo.dk> writes:

> det er kun spørgsmål om smag og behag, for hvilken del-sæt man vil bruge.
> håber at det har hjulpet.

Nej, alt efter hvilke tegn man man har brug for at kunne skrive inde i
strengen, så er det meget nyttigt at kunne vælge et passende sæt
qq{citationstegn}

qq{"'Vov', sagde greven"} er nu meget rar at kunne skrive uden at
skulle til at escape det ene sæt citationstegn.

--
Free beer får det bedste frem i en pingvin.
http://peter.makholm.net/beer/

e96mani@yahoo.dk (22-03-2001)
Kommentar
Fra : e96mani@yahoo.dk


Dato : 22-03-01 03:37

"Peter Makholm" <peter@makholm.net> wrote in message
news:87d7bbpquc.fsf@hacking.dk...
> <e96mani@yahoo.dk> writes:
>
> > det er kun spørgsmål om smag og behag, for hvilken del-sæt man vil
bruge.
> > håber at det har hjulpet.
>
> Nej, alt efter hvilke tegn man man har brug for at kunne skrive inde i
> strengen, så er det meget nyttigt at kunne vælge et passende sæt
> qq{citationstegn}

det, er det hvad jeg har kaldt for smag og behag - man kan selv vælge den
måde
som virker nemt for ens selv!




Thorbjørn Ravn Ander~ (12-03-2001)
Kommentar
Fra : Thorbjørn Ravn Ander~


Dato : 12-03-01 10:21

"F.Larsen" wrote:

> Hvilket perl modul skal man benytte for at grabbe html sider fra et (andet)
> website ind i en perl variabel ?

perldoc -q "fetch an HTML"

--
Thorbjørn Ravn Andersen "...sound of...Tubular Bells!"
http://bigfoot.com/~thunderbear

nnnn (21-03-2001)
Kommentar
Fra : nnnn


Dato : 21-03-01 09:19

F.Larsen wrote:

> Hej
>
> Hvilket perl modul skal man benytte for at grabbe html sider fra et (andet)
> website ind i en perl variabel ?


HTML::Parser gør vist det meste.


Søg
Reklame
Statistik
Spørgsmål : 177580
Tips : 31968
Nyheder : 719565
Indlæg : 6409079
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste