cyaMedlem sedan okt. 200010 inlägg Hej!
Mitt första inlägg :)
Min fråga är, hur gör jag om koden nedan så att jag kan använda den som en modul?
Typ så att jag kan använda den såhär:
my $clean = new HTML::RemoveHTML;
$clean->strip($HTML);
Tackar och bugar för all hjälp.
//Cya
package HTML::RemoveHTML;
use HTML::Parser;
use HTML::Entities qw(decode_entities);
@ISA = qw(HTML::Parser);
sub text {
my($self, $text) = @_;
print decode_entities($text);
}
RobbanMedlem sedan dec. 19992 555 inlägg
Mitt första inlägg :)
Hej, och välkommen! :)
Min fråga är, hur gör jag om koden nedan så att jag kan använda den som en modul?
Nu är jag ingen hejare på HTML::Parser, men typ:
HTML::RemoveHTML.pm
<font size="1" face="Verdana, Arial, Helvetica, sans-serif">
package HTML::RemoveHTML;
use strict;
use HTML::Entities qw(decode_entities);
use base HTML::Parser;
sub new {
my $self = HTML::Parser::new(@_);
return $self;
}
sub text {
my ($self, $text, $is_cdata) = @_;
print decode_entities($text);
}
sub strip {
my ($self, $html) = @_;
$self->parse($html);
}
1;
</font>
Ett testscript:
<font size="1" face="Verdana, Arial, Helvetica, sans-serif">
#!/usr/bin/perl -w
use strict;
use HTML::RemoveHTML;
my $html = << 'END_HTML';
<body><p>Ville, Valle & Viktor</p></body>
END_HTML
my $clean = new HTML::RemoveHTML;
$clean->strip($html);
</font>
Fungerar för mig i.a.f. :)
------------------
Robban < robban@lipogram.com >
RobbanMedlem sedan dec. 19992 555 inlägg Du kan t.o.m. kan utesluta metoden new() om du inte skall lägga till några egna attribut (HTML::RemoveHTML ärver då sin new() från HTML::Parser).
<font size="1" face="Verdana, Arial, Helvetica, sans-serif">
package HTML::RemoveHTML;
use strict;
use HTML::Entities qw(decode_entities);
use base HTML::Parser;
sub text {
my ($self, $text, $is_cdata) = @_;
print decode_entities($text);
}
sub strip {
my ($self, $html) = @_;
$self->parse($html);
}
1;
</font>
<font size="1" face="Verdana, Arial, Helvetica, sans-serif">
#!/usr/bin/perl -w
use strict;
use HTML::RemoveHTML;
my $html = << 'END_HTML';
<body><p>Ville, Valle & Viktor</p></body>
END_HTML
my $clean = new HTML::RemoveHTML;
$clean->strip($html);
</font>
------------------
Robban < robban@lipogram.com >
[Redigerat av Robban den 17 okt 2000]
cyaMedlem sedan okt. 200010 inlägg Hej!
Robban, tack för din tid!
Jag har försökt med båda förslagen utan framgång, jag kör Activestates perl på NT 4.
Det som händer när jag kör testscript är att det bara står och "tuggar", inga felmedelanden.
Så kan det stå hur länge som helst och jag måste avbryta (CTRL C) körningen manuellt.
Någon som har någon idé?
Tackar för all hjälp!
//Cya
OS:
Windows NT server 4 med sp 4 och option pack.
PERL:
ActiveState perl v5.6.0 binary build 618.
MODULER:
HTML::Entities.pm v 1.13
HTML::Parser v 2.23
[Redigerat av cya den 17 okt 2000]
RobbanMedlem sedan dec. 19992 555 inlägg Märkligt. Fungerar perfekt för mig, både på Linux och WinNT.
ActiveState perl v5.6.0 binary build 613
HTML::Entities.pm v 1.13
HTML::Parser v 2.23
Laddas alla moduler som de skall då? Prova med perls debugger:
perl -d test.pl
main::(test.pl:6): my $html = << 'END_HTML';
main::(test.pl:7): <body><p>Ville, Valle & Viktor</p></body>
main::(test.pl:8): END_HTML
DB<1> v
'Carp.pm' => 'E:/Perl/lib/Carp.pm'
'Carp/Heavy.pm' => 'E:/Perl/lib/Carp/Heavy.pm'
'Exporter.pm' => '5.562 from E:/Perl/lib/Exporter.pm'
'HTML/Entities.pm' => '1.13 from E:/Perl/site/lib/HTML/Entities.pm'
'HTML/Parser.pm' => '2.23 from E:/Perl/site/lib/HTML/Parser.pm'
'HTML/RemoveHTML.pm' => 'E:/Perl/site/lib/HTML/RemoveHTML.pm'
'Term/Cap.pm' => 'E:/Perl/lib/Term/Cap.pm'
'Term/ReadLine.pm' => 'E:/Perl/lib/Term/ReadLine.pm'
'base.pm' => '1.01 from E:/Perl/lib/base.pm'
'perl5db.pl' => '1.07 from E:/Perl/lib/perl5db.pl'
'strict.pm' => '1.01 from E:/Perl/lib/strict.pm'
'vars.pm' => 'E:/Perl/lib/vars.pm'
'warnings.pm' => 'E:/Perl/lib/warnings.pm'
'warnings/register.pm' => 'E:/Perl/lib/warnings/register.pm'
DB<1> q
Vill du stega dig igenom scriptet för att se var det fastnar så kan du göra det med n.
------------------
Robban < robban@lipogram.com >
[Redigerat av Robban den 17 okt 2000]
cyaMedlem sedan okt. 200010 inlägg Hej!
Jag har gjort bort mig. Jag har haft två filer med samma namn i olika kataloger och hela tiden trott att jag kört koden "testscript", men kört en annan. *bortgjord*
När jag exekverar striphtml.pl så får jag följande meddelande:
Unknown error
Compilation failed in require at striphtml.pl line 3.
BEGIN failed--compilation aborted at striphtml.pl line 3.
Jag får samma meddelande om jag kör med perls debbugger.
Har testat med alt. ett och två av RemoveHTML.pm, samma resultat.
Tycker det här verkar skumt.
Finns det fler sätt att felsöka på?
//Cya
[Redigerat av cya den 17 okt 2000]
RobbanMedlem sedan dec. 19992 555 inlägg Skumt är bara förnamnet. :)
Du har lagt RemoveHTML.pm i samma katalog som Parser.pm och Entities.pm? Och det är inga problem med NTFS-rättigheterna eller så?
Prova med att i testscriptet använda require i stället för use:
require HTML::RemoveHTML;
Det lär fortfarande bli fel, men förhoppningsvis kommer vi i.a.f. förbi kompileringen så att vi får ett runtime-fel i stället. Kanske ger ett vettigare felmeddelande, eller åtminstone gör att det går att använda debug.
Det är inga problem att köra HTML::Parser och HTML::Entities direkt från ett testscript?
------------------
Robban < robban@lipogram.com >
cyaMedlem sedan okt. 200010 inlägg Hej!
Kanon!!, nu fick jag kört perl debuggern, den klagade på:
use strict;
I HTML::RemoveHTML
Efter ha tagit bort det så fungerade det perfekt!
Fattade inte hur strict kunde spöka, men jag är ju ingen perl guru heller :)
Om jag skulle vilja retunera en lista eller sträng istället för att texten printas ut, hur gör jag då?
Ett stort tack för din hjälp!
//Cya
RobbanMedlem sedan dec. 19992 555 inlägg
Fattade inte hur strict kunde spöka, men jag är ju ingen perl guru heller :)
Förstår det inte heller. :l
Prova med att ha kvar strict, men att byta ut use base-raden mot:
our @ISA = ("HTML::Parser");
Blir det någon skillnad?
Om jag skulle vilja retunera en lista eller sträng istället för att texten printas ut, hur gör jag då?
Går säkert att lösa smidigare, med lite mer ingående kunskaper om hur HTML::Parser är uppbyggd. Men här är ett alternativ som i.a.f. fungerar för mig (använder både base och strict här - du får ändra det som krävs för att det skall fungera för dig). Metoden strip() returnerar här en sträng.
RemoveHTML.pm
<font size="1" face="Verdana, Arial, Helvetica, sans-serif">
package HTML::RemoveHTML;
use strict;
use HTML::Entities qw(decode_entities);
use base HTML::Parser;
sub new {
my $self = HTML::Parser::new(@_);
$self->{_output_cache} = undef;
return $self;
}
sub text {
my ($self, $text, $is_cdata) = @_;
$self->{_output_cache} .= decode_entities($text);
}
sub strip {
my ($self, $html) = @_;
$self->parse($html);
return $self->{_output_cache};
}
</font>
Ett testscript
<font size="1" face="Verdana, Arial, Helvetica, sans-serif">
#!/usr/bin/perl -w
use strict;
use HTML::RemoveHTML;
my $html = << 'END_HTML';
<html>
<head>
<title>Test</title>
</head>
<body>
<p>Ville, Valle & Viktor</p>
<p>Ville, Valle & Viktor</p>
<p>Ville, Valle & Viktor</p>
<p>Ville, Valle & Viktor</p>
<p>Ville, Valle & Viktor</p>
<p>Ville, Valle & Viktor</p>
</body>
</html>
END_HTML
my $obj = new HTML::RemoveHTML;
my $clean = $obj->strip($html);
print "Resultat:\n\n$clean";
</font>
------------------
Robban < robban@lipogram.com >
RobbanMedlem sedan dec. 19992 555 inlägg Du kanske förresten vill rensa cachen inför varje strip() (så att du kan rensa flera omgångar med samma objekt)?
<font size="1" face="Verdana, Arial, Helvetica, sans-serif">
sub strip {
my ($self, $html) = @_;
$self->{_output_cache} = undef;
$self->parse($html);
return $self->{_output_cache};
}
</font>
------------------
Robban < robban@lipogram.com >