Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]265[/thread]

HTML::Parser, HTML::Template::HEAD_BODY: Sektionen auslesen



<< >> 10 Einträge, 1 Seite
pktm
 2004-05-24 16:45
#2572 #2572
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Hallo!

Ich würde gerne von einer Webseite die Kopfdaten auslesen.
Dazu können gehören:
-css in Form von <STYLE></SYTLE> oder <link rel...
-JavaScript intern eingebunden (also Script></Script>)
-alle Meta-Tags
-Titel

Ich habe mich jetz bestimmt eine Stunde lang an HTML::Parser und Co probiert und irgendwie habe ich das Gefühl, dass die ganze Reihe nicht funktioniert.
Vielleicht liegts ja auch an mir und meiner Unfähigkeit eine englische Doku zu lesen und aus den knappen Beispielen (wenn vorhanden) zu lernen.

Kann mir wer ein vernünftiges Tutorial zu HTML::Pharser geben? Oder mir einfach den Code zum Auslesen der o.g. Sachen geben?

HTML::Template::HEAD_BODY sah recht vielversprechend aus.
Ich würde es auch gerne benutzen, da ich sowieso mit HTML::Template arbeite. Jedoch habe ich es nicht geschafft an die Meta-Tags ranzukommen. Die brauche ich jedoch dringends.
Der Rest war ganz zufriedenstellend und ich würde das Modul auch gerne benutzen.
mfg pktm
http://www.intergastro-service.de (mein erstes CMS :) )
coax
 2004-05-25 07:08
#2573 #2573
User since
2003-08-11
457 Artikel
BenutzerIn
[default_avatar]
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
use HTML::Parser;
my(%data) = (title => '',  meta => [],
            style => [],  script => []);

my($CURRENT);

my $p = new HTML::Parser (
    start_h => [sub {
                     my($tagname, $attr) = @_;
                     $CURRENT = $tagname;
                     push(@{$data{meta}}, $attr) if ($tagname eq 'meta');
                    }, 'tagname, attr'],
    text_h => [sub {
                 my($text) = @_;
                 
                 if    ($CURRENT eq 'title') {
                     $data{title} = $text;
                 }
                 elsif ($CURRENT eq 'style') {
                         push(@{$data{style}}, $text);
                     }
                 elsif ($CURRENT eq 'script') {
                         push(@{$data{script}}, $text);
                     }
                    }, 'dtext'],
    end_h => [sub { $CURRENT = '' }]);

$p->parse_file(*DATA);


Ist jetzt keine saubere Loesung, wird aber - denke ich mal - meinen Loesungsansatz verdeutlichen.

Grusz Christian.
,,Das perlt aber heute wieder...'' -- Dittsche
pktm
 2004-05-25 11:47
#2574 #2574
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Danke!
Wieso ist das keine saubere Lösung?
Ich habe das jetzt mal per HTML::TokeParser gelöst:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
my $p = HTML::TokeParser->new($file) ||
die "Can't open: $!";
my $head = {}; # Behälter für head-Tags
while (my $token = $p->get_token) {
# Abbruch bei Erreichen des body-Tags
if( $token->[0] eq "S" and $token->[1] eq 'body' ){
last;
}
#print Data::Dumper::Dumper($token);
# css_link
if( $token->[0] eq "S" and $token->[1] eq 'link' and $token->[2]->{'rel'} eq 'stylesheet' ){
push @{$head->{'css_link'}}, $token->[4];
}
# meta
if( $token->[0] eq "S" and $token->[1] eq 'meta' ){
push @{$head->{'meta'}}, $token->[4];
}
# title
if( $token->[0] eq "S" and $token->[1] eq 'title' ){
$head->{'title'} = $p->get_trimmed_text("/title");
}
# css_style
if( $token->[0] eq "S" and $token->[1] eq 'style' ){
push @{$head->{'css_style'}}, $p->get_trimmed_text("/style");
}
# js_script
if( $token->[0] eq "S" and $token->[1] eq 'script' and exists($token->[2]->{'language'}) and $token->[2]->{'language'} =~ /JavaScript/i ){
push @{$head->{'js_script'}}, $p->get_trimmed_text("/script");
}
}
print Data::Dumper::Dumper($head);


Worüber man sich noch streiten könnte ist, dass Leute ihr Scripten auch gerne irgendwo im Body platzieren (darf, bzw. soll man das?) und ich nur bis zum body-Start-Tag auslese.
Andererseits muss ich sowieso noch den body auslesen...
Mal sehen.
mfg pktm
http://www.intergastro-service.de (mein erstes CMS :) )
coax
 2004-05-25 17:54
#2575 #2575
User since
2003-08-11
457 Artikel
BenutzerIn
[default_avatar]
[quote=pktm,25.05.2004, 09:47]Danke!
Wieso ist das keine saubere Lösung?[/quote]
Weil zum Beispiel schlechter Quellcode - Endtags die kein Starttag mehr besitzen - den Parser durcheinander bringen kann.

Quote
Worüber man sich noch streiten könnte ist, dass Leute ihr Scripten auch gerne irgendwo im Body platzieren (darf, bzw. soll man das?) und ich nur bis zum body-Start-Tag auslese.
Andererseits muss ich sowieso noch den body auslesen...

Wenn du alle script-Tags brauchst dann wuerde ich auch das ganze Dokument durchforsten, weil du nicht sichergehen kannst das sich die Scriptangabe im Kopf befindet.
,,Das perlt aber heute wieder...'' -- Dittsche
Crian
 2004-05-25 18:05
#2576 #2576
User since
2003-08-04
5872 Artikel
ModeratorIn
[Homepage]
user image
Mit Skripten im Body musst Du rechnen, das ist absolut zulässig.
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
pktm
 2004-05-25 19:12
#2577 #2577
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Im Moment habe ich folgendes Problem:
Ich öffne die zu parsende Datei und lese sie in einen Scalar ein.
Dann übergebe ich eine Referenz auf diesen Scalar an das oben stehende TokeParser-Viech.
Wenn das aber fertig ist steht bei mir nicht mehr in dem Scalar und ich muss die Datei erneut einlesen um den Body mit Hilfe von HTML::Template::Extension (HEAD_BODY) ausgeben zu können.
Diesen Umweg über HTML::Template muss ich gehen, weil HTML::Toke::Parser mir nicht alles zwischen den <body>-Tags ausgeben kann (weis wer wie?).
Da bekomme ich nur den reinen Text zurück.
Laut Doku kann man gelesene Tokes aber wieder "zurückgeben", allerding ist die Funktion mit 2 Zeilen die sagen was das Ding macht absolut unzureichend dokumentiert - zumindest für jemanden der das Modul nicht geschrieben hat.

Wenn ich jetzt jedoch HTML::Template nutzen möchte, was ansich eine feine Sache ist, da unkompliziert und genau das macht, was es machen soll (also in Sachen Inhalt ausgeben, der Rest funktioniert da nicht... :( ) muss ich die Datei ja wieder öffnen und den Inhalt auslesen (bzw. den Parameter -filename an den Konstruktor übergeben).

Somit hätte ich 2 Dateizugriffe. Das ist mir zuviel :)
Hat jemand eine Idee, wie ich die Dateizugriffe minimieren kann?
(Habe es auch mit Filehandles probeirt, jedoch hat da TokeParser gquergeschossen.)
mfg pktm
http://www.intergastro-service.de (mein erstes CMS :) )
coax
 2004-05-25 20:20
#2578 #2578
User since
2003-08-11
457 Artikel
BenutzerIn
[default_avatar]
[quote=pktm,25.05.2004, 17:12]Dann übergebe ich eine Referenz auf diesen Scalar an das oben stehende TokeParser-Viech.
Wenn das aber fertig ist steht bei mir nicht mehr in dem Scalar und ich muss die Datei erneut einlesen ...[/quote]
wie waer's wenn du vorher eine Kopie des Inhalts in einer anderen Variable speicherst ?
Belegt zwar doppelt so viel Speicher, laesst aber weitere Einleseoperationen wegfallen.

Grusz Christian.
,,Das perlt aber heute wieder...'' -- Dittsche
pktm
 2004-05-25 20:47
#2579 #2579
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
du meinst my $copy = $textdatei; ?
Das habe ich probiert, es ging irgendwie nicht.
$textdatei war dabei auch wirklich der Inhalt, also keine Referenz (die wurde erst bei der übergabe von $copy an das Template / Parser - Objekt erstellt).
mfg pktm
http://www.intergastro-service.de (mein erstes CMS :) )
coax
 2004-05-25 20:53
#2580 #2580
User since
2003-08-11
457 Artikel
BenutzerIn
[default_avatar]
[quote=pktm,25.05.2004, 18:47]du meinst my $copy = $textdatei; ?
Das habe ich probiert, es ging irgendwie nicht.[/quote]
das kann nicht sein.. da musst irgendwo ein Fehler haben... probier nochmal :)

Grusz Christian.
,,Das perlt aber heute wieder...'' -- Dittsche
pktm
 2004-05-25 21:31
#2581 #2581
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Jo, muss irgendwo ein Fehler gewesen sein.
habe es jetzt zu Hause ausprobiert und es geht.
thx & mfg pktm
PS: wenn ihr das dringende bedürfnis verspürt mit mir zusammen mal ein Tutorial über diese HTML::Parser - Module zu schreiben, bzw. eine FAQ mit geläufigen Anwendungen dann meldet euch doch mal per PM bei mir :)

PSS: Verbesserungsvorschläge zu obigen Code (beiden) sind ebenfalls gerne willkommen.
http://www.intergastro-service.de (mein erstes CMS :) )
<< >> 10 Einträge, 1 Seite



View all threads created 2004-05-24 16:45.