Schrift
[thread]8996[/thread]

HTML::Parser

Leser: 9


<< >> 5 Einträge, 1 Seite
sid burn
 2007-05-11 17:42
#76646 #76646
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
Hi zusammen,

irgendwie bin ich zur Zeit mit der OOP vom Modul HTML::Parser etwas unzufrieden. Ich stelle es mir eigentlich so vor das ich ein Objekt davon erstelle und Regeln definiere. Genau das geht ja auch. Aber innerhalb der Methoden habe ich irgendwie keine Möglichkeiten den Output irgendwo hinzuschreiben. Auser in Globale Variablen, oder von mir aus Closures. Das ist mir aber alles zu umständlich und schaut mir schon mehr nach einem Hack aus.

Ich würde mir eigentlich soetwas Wünschen:
Code: (dl )
 my $result = $p->parse( $text )


So das er den kompletten $text durchparst die Regeln anwendet und ich alles schön in einer lexikalischen Variable bekomme. Ist das irgendwie machbar?

Zur Zeit benutze ich solch einen "Hack":

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
{
package HTML::Parser;
our $output;

sub get_result {
my ($self, $text) = @_;

$HTML::Parser::output = undef;
$self->parse( $text );
$self->eof;
return $HTML::Parser::output;
}
}

my $p = HTML::Parser->new( api_version => 3 );
$p->handler( text => sub { $HTML::Parser::output .= $_[0] }, 'text' );


my $header = '<html><head><title>Der Titel</title></head></html>';
my $body = '<body>Jetzt fängt der Body an</body>';


print $p->get_result($header), "\n", $p->get_result($body), "\n";


Ich füge also eine Methode und eine Package Variable in HTML::Parser hinzu.

Der Handler speichert immer seinen Output bereits in der Package Variable. Jedesmal wenn ich meine Methode aufrufe, habe ich ein neues Stück Text was ich parsen möchte, sprich ich setze die Package Variable wieder auf undef.


Ich habe also die Möglichkeit soetwas wie im print unten zu machen, aber Glücklich bin ich mit dieser ganzen Vorgehensweise nicht.

Ich habe mir Tutorials zu HTML::Parser durchgelesen und die Doku, aber keine Möglichkeit gefunden das es sich so verhält wie ich es mir Vorstelle. Geht das nicht, oder habt ihr vielleicht eine andere Möglichkeit wie ich das ganze etwas "ungefährlicher" gestalten kann?
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
renee
 2007-05-11 18:04
#76647 #76647
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Ich kenne auch nichts in der Richtung. Wie ich mit CPAN:HTML::Parser arbeite, ist im Wiki:entsprechenden Artikel ersichtlich.
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
ptk
 2007-05-13 12:21
#76648 #76648
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Was hältst du vom Abschnit SUBCLASSING im Pod von HTML::Parser? Ich verstehe das so, dass du deine eigenen Daten im $p-Hash halten darfst, solange die Keys nicht mit _hparser anfangen. Zudem würde ich get_result in einer Subklasse von HTML::Parser unterbringen.
sid burn
 2007-05-15 02:09
#76649 #76649
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
[quote=ptk,13.May.2007, 10:21]Was hältst du vom Abschnit SUBCLASSING im Pod von HTML::Parser? Ich verstehe das so, dass du deine eigenen Daten im $p-Hash halten darfst, solange die Keys nicht mit _hparser anfangen. Zudem würde ich get_result in einer Subklasse von HTML::Parser unterbringen.[/quote]
Hi,
ja das ist noch eine sehr gute Idee die mir gefällt. Ich schaue mir aber zur Zeit noch paar andere Interface zu HTML::Parser an.

Das was mir bisher ganz gut gefallen hat ist HTML::TokeParser::Simple

Das kommt schon nahe an dem dran wie ich mir das vorstellen würde, aber irgendwie habe ich z.B: noch keinen vernünftigen weg gefunden um z.B. nach einem "tr" Tag zu suchen und mir dann alle "td" tags unterhalb des tr Tags ausgeben zu lassen. (Ein Beispiel ich weiß das es ein extra Modul gibt um Tabellen zu extrahieren)

Ansonsten gab es noch ein Modul das den HTML Code in einer Baumstruktur aufgebaut hat und man diesen Baum dann durchgehen konnte. In der Doku wurde der Aufbau des Baumes auch erklärt. Aber irgendwie finde ich das Modul nicht mehr. HTML::TreeBuilder war es aber nicht.

Ansonsten habe ich irgendwo im Internet noch was gefunden wo jemand mit einem XML Modul HTML geparsed hatte. Man konnte da irgendwie ein Suchpattern angeben und das ist sozusagen darüber gelaufen und hatt die Ergebnisse ausgeliefert. Weiß aber auch nicht mehr welches Modul das war, noch wo ich es gefunden hatte.

Kennt da noch jemand etwas anderes? Ich kann mich mit HTML::Parser auf dauer irgendwie gar nicht anfreunden.\n\n

<!--EDIT|sid burn|1179180684-->
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
ptk
 2007-05-15 03:30
#76650 #76650
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Versuch mal CPAN:HTML::TreeBuilder::XPath.
Beispiel:
Code: (dl )
1
2
3
4
5
6
7
8
use HTML::TreeBuilder::XPath;
my $x = HTML::TreeBuilder::XPath->new;
$x->parse(<<EOF);
<html><head><title>Der Titel</title></head>
<body>Jetzt fängt der Body an</body>
</html>
EOF
warn $x->findvalue('//body');
<< >> 5 Einträge, 1 Seite



View all threads created 2007-05-11 17:42.