| |
|
HTML::Parser |
piep001
Elite Member
  

Dabei seit: 01.03.2004
Beiträge: 337
Herkunft: NRW
 |
|
Hi Leute,
ich habe nen Problem mit dem Perl-Modul " HTML Parser".
Auf Deutsch: Ich raff das nicht!!
Habe schöne Hilfen gefunden und mir auch unter cpan.org die Doku durchgelesen, aber ehrlich gesagt komme ich da nur voll ins Schleudern und weiß nicht mehr weiter.
Was ich vor habe ist, eine eMail von HTML-Code zu befreien. Ich hatte es erst mittel RegEx ganz gut hinbekommen, aber dann wurde mir dazu geraten lieber den HTML:
arser zu verwenden, da dieser zuverlässiger und effektiver sei.
http://wiki.perl-community.de/bin/view/W...oduleHTMLParser
http://search.cpan.org/~gaas/HTML-Parser-3.45/Parser.pm
In der Perl-Community (erster Link) gibt es am Ende ein Beispiel, welches HTML-Code splittet, aber auch das habe ich nicht verstanden. Bin wohl zu doof.
Dazu will ich noch sagen, dass ich von objektorienter Programmierung kaum ne Ahnung und es so gut wie noch nie wirklich angewendet habe.
Wäre euch super Dankbar, wenn ich Hilfe bekommen könnte. Ich verzweifele langsam.
__________________ Spaß im Netz auf www.piep001.de
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von piep001: 15.03.2005 16:56.
|
|
15.03.2005 16:54 |
|
|
Der Betreiber und die Moderatoren vom www.coder-board.de distanzieren sich hiermit ausdrücklich von dem von piep001 am 15.03.2005 um 16:54 verfassten Beitrag. Sollte dieser Beitrag Ihre Rechte verletzen, bitten wir um Benachrichtigung unter Berücksichtigung der dort aufgeführten Möglichkeiten.
|
Google
 |
|
|
|
Ephraim
Hobby Progger
  

Dabei seit: 23.03.2004
Beiträge: 826
Herkunft: coder-board.info
 |
|
Na verzweifeln brauchste da aber net
... des krieg ma schon auf die Reihe!
Hier mal des erste Beispiel von der oben genannten Seite.
Ich hab da mal ein paar Kommentare reingeschrieben vielleicht wirds dann klarer
| code: |
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:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
|
#! /usr/bin/perl
use strict;
use warnings;
use HTML::Parser;
# Hier stehen dann nachher die Links drin
my @links;
# Das ist einfach nur Beispiel Text und der geht von qq~ bis ~ nicht von " bis " !!! ;)
my $string = qq~<a href="url1">linktext1</a> Ein anderer Text
<a href="url2">linktext2</a> text~;
# Ein Object vom Parser erstellen
my $p = HTML::Parser->new();
# Hier wird eine Rückruf Sub (Callback oder auch Handler genannt) festgelegt.
# Der Parser ruft diese Funktion immer genau dann auf wenn er einen Anfang eines Tags
# findet.
# Der erste Parameter gibt an des es eben der Handler für den Start eines Tags ist
# Der zweite Parameter gibt an, das die Parameter die dem Handler übergeben werden
# sollen in der Reihenfolge tagname, attr, self sind bzw. sein sollen.
# tagname ist der Name des gefunden Tags logisch oder ;)
# attr ist ein Hash von den attributen die das Tag hat
# und self ist das Object vom Parser also im endeffekt in diesem Beispiel wieder das $p
# von ein paar Zeilen drüber
$p->handler(start => \&start_handler,"tagname,attr,self");
# hier fängt der eigentlich Parse Vorgang an
$p->parse($string);
# nur die Ausgabe nachdem alles fertig ist ;)
foreach my $link(@links){
print "Linktext: ",$link->[1],"\tURL: ",$link->[0],"\n";
}
# Hier unser start Handler
sub start_handler{
# wir errinnern uns, der erste Parameter war tagname
# d.h. wenn der Tagname nicht "a" ist, von dem Tag was gefunden wurde
# wird hier nix gemacht
return if(shift ne 'a');
# der zweite Parameter waren die attribute
# und hier wird der Inhalt des Attributes href rausgeholt und abgelegt.
my ($class) = shift->{href};
# jetzt noch unser $p holen
my $self = shift;
my $text;
# hier werden jetzt dynamisch sub erzeugt und als handler angegeben
# Dieser handler ist für den Text <a>TEXT</a> zuständig und wird
# aufgerufen wenn der Text gefunden wurde, der erste Parameter des Subs wird
# hier festgelegt auf den Text ansich. Mehr Parameter für das Sub werden hier nicht
# benötigt.
$self->handler(text => sub{$text = shift;},"dtext");
# Dieser Handler ist für das Ende Tag zuständig also für </a> bzw. er wird dann
# aufgerufen wenn das Ende gefunden wurde.
# hier wird wieder ein Sub dynamisch erzeugt, und als Parameter bekommt dieses sub
# nur den Tagnamen also "a". Wird das Sub aufgerufen, prüft es nach ob der erste
# Parameter ein "a" ist, wenn dann wird in das Array @links ein Array reingepusht mit
# dem Text der im Texthandler und mit dem link der im Starthandler
# im Attribute href gefunden wurde.
$self->handler(end => sub{push(@links,[$class,$text]) if(shift eq 'a')},"tagname"); |
|
So hoffe jetzt isses ein bissel klarer ... frage einfach wenn du noch fragen hast oder versuch du mal das nächste Beispiel zu kommentieren, und ich sag dir dann ob du es verstanden hast oder obs irgendwo noch net so klappt
Ciao Ephraim
__________________
- Google
- SelfHTML's Quickbar Supertool (für HTML,CSS,Javascript Fragen)
- CSS 4 You (für CSS Fragen)
- CoderBoard's Search
- After that, with no success, post here
|
|
16.03.2005 08:19 |
|
|
Ephraim
Hobby Progger
  

Dabei seit: 23.03.2004
Beiträge: 826
Herkunft: coder-board.info
 |
|
|
16.03.2005 08:26 |
|
|
Affilimatch
 |
|
|
|
piep001
Elite Member
  

Dabei seit: 01.03.2004
Beiträge: 337
Herkunft: NRW
Themenstarter
 |
|
Hi Ephraim,
warum bekommt man solche Erläuterungen nicht mal sonst so im Netz. Danke dir jedenfalls dafür.
Habe hier ein Script gefunden, welches mein Problem löst und welches ich in den letzten zwei Stunden, anhand deiner Erläuterung, mal versucht habe zu verstehen. habe es kommentiert und du kannst ja mal schaun, ob ich es richtig verstanden habe.
Einmal das Script als ganzes und dann mit meinen Kommentare...
| code: |
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:
|
my $parser = HTML::Parser->new(
start_h => [ \&_starttag, 'self, tagname, attr' ],
end_h => [ \&_endtag, 'self, tagname' ],
text_h => [ \&_text, 'self, dtext' ]
);
$parser->parse($email_text);
sub _starttag {
my ($self, $tag, $attr) = @_;
$self->{'_body'} = 1 if($tag eq 'body');
}
sub _endtag {
my ($self, $tag) = @_;
$self->{'_body' } = 0 if($tag eq 'body' );
}
sub _text {
my ($self, $dtext) = @_;
$dtext =~ s/\A\s+//;
$dtext =~ s/\s+\z//;
return() unless ( length($dtext) > 0 and $dtext =~ /[^\s]/ );
if ($self->{'_body'} == 1) {
print $dtext;
}
} |
|
| code: |
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:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
|
# hier wird ein neues objekt (namens $parser) der klasse HTML::Parser erzeugt.
# als events werden start_h, end_h und text_h mit eingebunden, welche eine referenz
# auf die funktionen _starttag, _endtag und _text enthalten. am ende jeder zeile werden
# die benötigten attribute mit übergeben, self steht dabei für das objekt (hier $parser).
my $parser = HTML::Parser->new(
start_h => [ \&_starttag, 'self, tagname, attr' ],
end_h => [ \&_endtag, 'self, tagname' ],
text_h => [ \&_text, 'self, dtext' ]
);
# aufruf der methode ?parse? mit dem übergabewert $email_text
$parser->parse($email_text);
# funktion die bei jedem start_h event ausgeführt wird, also wenn ein HTML-tag
# im text beginnt
sub _starttag {
my ($self, $tag, $attr) = @_;
# wenn der aktuelle start- HTML-tag = ?body? entspricht, setze die eigenschaft _body des
# aktuellen objekts (hier $self was im grunde für $parser steht) = 1.
$self->{'_body'} = 1 if($tag eq 'body');
}
# funktion die bei jedem end_h event ausgeführt wird, also wenn ein HTML-tag
# im text geschlossen wird
sub _endtag {
my ($self, $tag) = @_;
# wenn der aktuelle end- HTML-tag = ?body? entspricht, setze die eigenschaft _body des
# aktuellen objekts (hier $self was im grunde für $parser steht) = 0.
$self->{'_body' } = 0 if($tag eq 'body' );
}
# funktion die bei jedem text_h event ausgeführt wird
sub _text {
my ($self, $dtext) = @_;
# am anfang und ende des strings steuerzeichen entfernen
$dtext =~ s/\A\s+//;
$dtext =~ s/\s+\z//;
# prüfen, ob der string mehr als 0 zeichen und nicht nur steuerzeichen enthält
return() unless ( length($dtext) > 0 and $dtext =~ /[^\s]/ );
# solange man sich zwischen den body-tags befindet (siehe funktion _startag und _endtag)
# ausgabe von $dtext (enthält alles zwischen den beiden aktuellen tags)
if ($self->{'_body'} == 1) {
print $dtext;
}
}
|
|
__________________ Spaß im Netz auf www.piep001.de
|
|
16.03.2005 15:30 |
|
|
Der Betreiber und die Moderatoren vom www.coder-board.de distanzieren sich hiermit ausdrücklich von dem von piep001 am 16.03.2005 um 15:30 verfassten Beitrag. Sollte dieser Beitrag Ihre Rechte verletzen, bitten wir um Benachrichtigung unter Berücksichtigung der dort aufgeführten Möglichkeiten.
|
piep001
Elite Member
  

Dabei seit: 01.03.2004
Beiträge: 337
Herkunft: NRW
Themenstarter
 |
|
Ha, wie geil. Ich hab gerade noch was viel einfacheres gefunden.
Das Buch "Effektives Programmieren mit Perl 5" (ISBN 3-8273-1095-4) ist einfach genial.
| code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
|
#!/usr/bin/perl -w
use strict;
use warnings;
use HTML::FormatText;
use HTML::Parse;
my $ HTML;
my $formatter;
$ HTML = HTML::Parse::parse_htmlfile("beispiel. HTML");
# alternativ ginge auch... $ HTML = HTML::Parse::parse_html($text);
# ...um den HTML-Text aus einer Variablen zu holen
$formatter = HTML::FormatText->new();
print $formatter->format($ HTML); |
|
__________________ Spaß im Netz auf www.piep001.de
|
|
16.03.2005 17:02 |
|
|
Der Betreiber und die Moderatoren vom www.coder-board.de distanzieren sich hiermit ausdrücklich von dem von piep001 am 16.03.2005 um 17:02 verfassten Beitrag. Sollte dieser Beitrag Ihre Rechte verletzen, bitten wir um Benachrichtigung unter Berücksichtigung der dort aufgeführten Möglichkeiten.
|
Ebay
 |
|
|
|
Prometheus
Administrator

Dabei seit: 09.05.2003
Beiträge: 2.950
 |
|
also das letzte was du gepostet hast is so easy das hab sogar ich verstanden *gg*
wie genau wendest du das jetzt an in verbindung mit mails?
__________________
mfg Prometheus
|
|
|
Ich gebe keinen Support per PN, Email oder sonstiges!
Alle Fragen können offen hier im Forum behandelt werden.
|
|
|
16.03.2005 17:41 |
|
|
Ephraim
Hobby Progger
  

Dabei seit: 23.03.2004
Beiträge: 826
Herkunft: coder-board.info
 |
|
Jo also verstanden hast du jetzt des erste auch
...
Was macht jetzt der Formatter? Der gibt dann nur des HTML Formatiert aus oder
wie darf ich das jetzt verstehen?
Aber wenn, dann war das doch nicht das was du wolltest? Du wolltest doch den
Text aus einer HTML Mail rausfiltern, oder hab ich da was falsch verstanden?
Ciao Ephraim
[EDIT]Ach nee ... des is ja FormatText
... wer lesen kann ist deutlich im Vorteil
.
Insofern gibt des dir dann schon den Text zurück, richtig?![/EDIT]
__________________
- Google
- SelfHTML's Quickbar Supertool (für HTML,CSS,Javascript Fragen)
- CSS 4 You (für CSS Fragen)
- CoderBoard's Search
- After that, with no success, post here
|
|
16.03.2005 18:21 |
|
|
Ebay
 |
|
|
|
piep001
Elite Member
  

Dabei seit: 01.03.2004
Beiträge: 337
Herkunft: NRW
Themenstarter
 |
|
| |
| |