purzelbaum
unsere besten emails
Coder Board Community

 
Boardmenü
Forum
Portal

Registrieren
Suche
Statistik
Mitglieder
Team
Kalender
Sponsoren
Partner

F.A.Q

Lexikon
Amazon Shop
Unterforen Navigation
Hardware
Software
Betriebssysteme
Foren & CMS
EDV Sicherheit
Telekommunikation
Tutorials & FAQ's
Downloads
Boardsuche
Board durchsuchen:

Wer ist Online ?
Zur Zeit im Forum unterwegs:
- 0 Mitglieder
- davon 0 unsichtbar
- 10 Besucher
- 4 Bot(s)
- 14 Benutzer gesamt


Wer ist wo online?
Wer war Online ?
Heute waren 0 Mitglieder im Forum unterwegs.
Linktip's
   Eigene Projekte:
auto-board.info
film-freunde.info
flirt-freunde.info
linkhunter.info
tier-freunde.info
spass-forum.info
buch-freunde.info
mystic-freunde.de
heimwerker-freunde.de

   Befreundete Projekte:
holyhell.de
emsfriends.de

Coder Board Community » Coding » Perl » HTML::Parser » Hallo Gast [Anmelden|Registrieren]
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | An Freund senden | Thema zu Favoriten hinzufügen
Seiten (2): [1]2 nächste » Neues Thema erstellen Antwort erstellen
Zum Ende der Seite springen HTML::Parser
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
piep001 piep001 ist männlich
Elite Member


images/avatars/avatar-38.gif

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

Fragezeichen HTML::Parser Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Hi Leute,
ich habe nen Problem mit dem Perl-Modul " HTML Parser".
Auf Deutsch: Ich raff das nicht!! traurig

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:Zunge raus 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 piep001 ist offline E-Mail an piep001 senden Homepage von piep001 Beiträge von piep001 suchen Nehmen Sie piep001 in Ihre Freundesliste auf Fügen Sie piep001 in Ihre Kontaktliste ein AIM-Name von piep001: MIBpiep MSN Passport-Profil von piep001 anzeigen
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
Zum Anfang der Seite springen

http://www.itratos.de
Ephraim Ephraim ist männlich
Hobby Progger


images/avatars/avatar-58.gif

Dabei seit: 23.03.2004
Beiträge: 826
Herkunft: coder-board.info

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Na verzweifeln brauchste da aber net Augenzwinkern ... 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 smile
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 Augenzwinkern

Ciao Ephraim

__________________
  1. Google
  2. SelfHTML's Quickbar Supertool (für HTML,CSS,Javascript Fragen)
  3. CSS 4 You (für CSS Fragen)
  4. CoderBoard's Search
  5. After that, with no success, post here smile


16.03.2005 08:19 Ephraim ist offline E-Mail an Ephraim senden Beiträge von Ephraim suchen Nehmen Sie Ephraim in Ihre Freundesliste auf AIM-Name von Ephraim: Gibts Nicht mehr YIM-Name von Ephraim: Gibts Nicht mehr
Ephraim Ephraim ist männlich
Hobby Progger


images/avatars/avatar-58.gif

Dabei seit: 23.03.2004
Beiträge: 826
Herkunft: coder-board.info

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Nebenbei schau ich des ich wenn ich on bin auch im chat idle smile also schau mal vorbei! smile

Ciao Ephraim

__________________
  1. Google
  2. SelfHTML's Quickbar Supertool (für HTML,CSS,Javascript Fragen)
  3. CSS 4 You (für CSS Fragen)
  4. CoderBoard's Search
  5. After that, with no success, post here smile


16.03.2005 08:26 Ephraim ist offline E-Mail an Ephraim senden Beiträge von Ephraim suchen Nehmen Sie Ephraim in Ihre Freundesliste auf AIM-Name von Ephraim: Gibts Nicht mehr YIM-Name von Ephraim: Gibts Nicht mehr
Affilimatch
Zum Anfang der Seite springen

http://www.itratos.de
piep001 piep001 ist männlich
Elite Member


images/avatars/avatar-38.gif

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

Themenstarter Thema begonnen von piep001
Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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 piep001 ist offline E-Mail an piep001 senden Homepage von piep001 Beiträge von piep001 suchen Nehmen Sie piep001 in Ihre Freundesliste auf Fügen Sie piep001 in Ihre Kontaktliste ein AIM-Name von piep001: MIBpiep MSN Passport-Profil von piep001 anzeigen
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 piep001 ist männlich
Elite Member


images/avatars/avatar-38.gif

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

Themenstarter Thema begonnen von piep001
Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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 piep001 ist offline E-Mail an piep001 senden Homepage von piep001 Beiträge von piep001 suchen Nehmen Sie piep001 in Ihre Freundesliste auf Fügen Sie piep001 in Ihre Kontaktliste ein AIM-Name von piep001: MIBpiep MSN Passport-Profil von piep001 anzeigen
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
Zum Anfang der Seite springen

http://www.itratos.de
Prometheus Prometheus ist männlich
Administrator


images/avatars/avatar-9.gif

Dabei seit: 09.05.2003
Beiträge: 2.950

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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

Projektoren

Grafikkarten

Fertig-PC´s

TFT´s

Notebooks
Ich gebe keinen Support per PN, Email oder sonstiges!
Alle Fragen können offen hier im Forum behandelt werden.

16.03.2005 17:41 Prometheus ist offline Homepage von Prometheus Beiträge von Prometheus suchen Nehmen Sie Prometheus in Ihre Freundesliste auf
Ephraim Ephraim ist männlich
Hobby Progger


images/avatars/avatar-58.gif

Dabei seit: 23.03.2004
Beiträge: 826
Herkunft: coder-board.info

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Jo also verstanden hast du jetzt des erste auch Augenzwinkern ...

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? smile

Ciao Ephraim
[EDIT]Ach nee ... des is ja FormatText Augenzwinkern ... wer lesen kann ist deutlich im Vorteil Augenzwinkern .
Insofern gibt des dir dann schon den Text zurück, richtig?![/EDIT]

__________________
  1. Google
  2. SelfHTML's Quickbar Supertool (für HTML,CSS,Javascript Fragen)
  3. CSS 4 You (für CSS Fragen)
  4. CoderBoard's Search
  5. After that, with no success, post here smile


16.03.2005 18:21 Ephraim ist offline E-Mail an Ephraim senden Beiträge von Ephraim suchen Nehmen Sie Ephraim in Ihre Freundesliste auf AIM-Name von Ephraim: Gibts Nicht mehr YIM-Name von Ephraim: Gibts Nicht mehr
Ebay
Zum Anfang der Seite springen

http://www.itratos.de
piep001 piep001 ist männlich
Elite Member


images/avatars/avatar-38.gif

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

Themenstarter Thema begonnen von piep001