Kommentare aus HTML-Dateien extrahieren
Hallo, ich möchte mit Perl gerne einfache Kommentare (z.B. "<!-- Ich bin ein Kommentar -->") aus einer HTML-Datei extrahieren. Dazu habe ich mir folgenden Code ausgedacht: ---cut--- #!/usr/bin/perl die "Benutzung: $0 dateiname\n" unless defined $ARGV[0]; open DATEI, $ARGV[0] or die "Fehler beim Oeffnen der Datei ($!)\n"; while ($zeile=<DATEI>) { chomp; if ($zeile =~ /<!--.*?-->/) { print $zeile; } } close DATEI; ---cut--- Der Code klappt auch soweit wunderbar, nur leider kann dieser keine Kommentare erkennen, die Zeilenumbrüche enthalten bzw. sich über mehrere Zeilen erstrecken. Hat jemand dafür eine Idee, die vielleicht sogar ohne zusätzliche Perl-Module auskommt? Viele Dank und schöne Grüße, Werner. -- +++ GMX - Mail, Messaging & more http://www.gmx.net +++ Bitte lächeln! Fotogalerie online mit GMX ohne eigene Homepage!
On Tuesday 01 July 2003 17:36, Werner Schalk wrote:
Der Code klappt auch soweit wunderbar, nur leider kann dieser keine Kommentare erkennen, die Zeilenumbrüche enthalten bzw. sich über mehrere Zeilen erstrecken. Hat jemand dafür eine Idee, die vielleicht sogar ohne zusätzliche Perl-Module auskommt?
Ganzes File in einem Rutsch einlesen und mit Regexp-Option "m" bearbeiten:
perldoc perlre:
m Treat string as multiple lines. That is, change "^"
and "$" from matching the start or end of the string
to matching the start or end of any line anywhere
within the string.
Einlesen auf einen Rutsch:
open( HTML, $infile ) or die "Can't open $infile";
undef $RS; # prepare to read entire file a once
my $html = <HTML>; # read the entire file into $ycp_code
close( HTML );
Und dann über $html in einer while-Schleife immer wieder Kommentare suchen
bzw. suchen und ersetzen, je nachdem, ob Du sie rauswerfen oder nur auswerten willst.
Ich habe mal so etwas ähnliches für YCP-Code geschrieben ("check_ycp", sag, wenn Du es
komplett haben willst - per PM):
while ( $ycp =~
s{ # substitute
( # this will be reference $1
/\* # literal /*
(.*?) # anything (non-greedy - thus "?") - ref $2
\*/ # literal */
) # ref $1 end
( # ref $3 start
.*$ # anything until the very end
) # ref $3 end
}
{ # replacement is an expression (thus flag "e" below)
my $comment = $1;
my $rest = $3;
$comment =~ s/[^\n]*//gms; # delete everything but the newlines
$comment . $rest; # the replacement string
}gmsxe
# "x" allow comments in regexp
# "g" global - replace all occurences
# "m" multi-line input string
# "s" "." matches newlines
)
{
# NOP
# As I understood the doc, this loop around the replacement shouldn't
# be necessary (since the "g" flag is specified), but it is. Strange.
# Can somebody tell me why?
#
# sh@suse.de 2001-05-04
}
Probier's mal.
CU
--
Stefan Hundhammer
Am Dienstag, 1. Juli 2003 17:36 schrieb Werner Schalk:
Hallo,
ich möchte mit Perl gerne einfache Kommentare (z.B. "<!-- Ich bin ein Kommentar -->") aus einer HTML-Datei extrahieren. Dazu habe ich mir folgenden Code ausgedacht:
Am einfachsten geht das, wenn Du die ganze Datei auf einmal in einen String einliest: { local $/; my $content = <IN>; $content =~ s/<!--.*?-->//gsx; } Den Code zum Einlesen der Datei und zum Schreiben des Ergebnisses in eine Datei musst Du dann noch drum herum basteln, aber das sollte ja keine Problem für Dich sein :-) Viele Grüße, Ralf.
Moin, Am Die, 2003-07-01 um 17.56 schrieb Ralf Schneider:
$content =~ s/<!--.*?-->//gsx;
Wieso x in gsx ? Gruß, Ratti -- -o) fontlinge | Font management for Linux | Schriftenverwaltung in Linux /\\ http://freshmeat.net/projects/fontlinge/ _\_V http://www.gesindel.de https://sourceforge.net/projects/fontlinge/
Hallo Ralf, hallo Liste, ich habe den Perl-Quellcode jetzt wie folgt geändert: #!/usr/bin/perl die "Benutzung: $0 dateiname\n" unless defined $ARGV[0]; open DATEI, $ARGV[0] or die "Fehler beim Oeffnen der Datei ($!)\n"; my @zeilen = <DATEI>; close DATEI; local $/; foreach (@zeilen) { my $content = $_; # gs und gsx macht keinen Unterschied! $content =~ s/<!--.*?-->//gs; print $content; } Das Problem ist jetzt, dass einzeilige Kommentare irgendwie nicht mehr ausgegeben werden und teilweise wird jetzt auch normaler HTML-Code mit ausgegeben. Ist der Code so falsch bzw. weiß jemand, wie ich alle HTML-Kommentare aus einer beliebigen HTML-Seite rausfischen kann? Vielen Dank und schöne Grüße, Werner.
Hi, On Tue, 1 Jul 2003, Werner Schalk wrote:
my @zeilen = <DATEI>;
Das splittet ja schon wieder in Zeilen. Du willst: my $alles = <DATEI>; Beachte das dies ein scalar, keine Array ist. Das dies tatsache die ganze Datei in einen String liest musst du den line-separator undefen: undef $/; Es empfiehlt sich, diesen vorher irgendwo zwischenzuspeichern, um ihn zueruecksetzen zu koennen.
foreach (@zeilen) {
Und dann auch kein foreach natuerlich, du willst ja gerade nicht ueber Zeilen iterieren, sondern alles in einem Rutsch veraendern.
# gs und gsx macht keinen Unterschied! $content =~ s/<!--.*?-->//gs;
Und dann wuerde dies naemlich fast gehen, da "." auch "\n" matcht. '/x' brauchst du Tatsache nicht, da ".*?" allein nicht schon extended syntax ist. Also alles zusammen: open(F, "test.html"); my $old_ils = $/; undef $/; my $all = <F>; $/ = $old_ils; close F; $all =~ s/<!--.*?-->//gs; print $all; Ciao, Micha.
Hello, On Tue, 01 Jul 2003, Michael Matz wrote:
Beachte das dies ein scalar, keine Array ist. Das dies tatsache die ganze Datei in einen String liest musst du den line-separator undefen:
undef $/;
*patsch* Das ist boese! Ich weiss grad nicht wo das steht, ah, doch: man -P'less "+/ slurp mode"' perlvar
open(F, "test.html"); my $old_ils = $/; undef $/; my $all = <F>; $/ = $old_ils; close F;
s.o. my $all = ''; open(F, "test.html") or die $!; { local $/; $all = <F>; } close(F); -dnh -- I used to be a multiple personality, until we took a vote and decided we weren't. -- Stevo in the SDM
Abend
ich möchte mit Perl gerne einfache Kommentare (z.B. "<!-- Ich bin ein Kommentar -->") aus einer HTML-Datei extrahieren. Dazu habe ich mir folgenden Code ausgedacht:
Am einfachsten geht das, wenn Du die ganze Datei auf einmal in einen String einliest:
{ local $/; my $content = <IN>; $content =~ s/<!--.*?-->//gsx; }
Was ist mit Zeichenfolgen Reply
Hello, On Tue, 01 Jul 2003, Werner Schalk wrote:
ich möchte mit Perl gerne einfache Kommentare (z.B. "<!-- Ich bin ein Kommentar -->") aus einer HTML-Datei extrahieren.
Hier noch mit HTML::Parser: ==== #! /usr/bin/perl -w use strict; use HTML::Parser; my $p = HTML::Parser->new( comment_h => [ sub{print @_;}, "text"]); $p->parse_file(*STDIN); ==== Ein "html2text" waere z.B.: my $p = HTML::Parser->new( text_h => [ sub{print @_;}, "dtext"]); $p->parse_file(*STDIN); Man kann sich also fuer jeden Teil eigene "handler" definieren ;) -dnh -- 166: Wiedervereinigung Verschmelzung zweier Staaten ohne Rücksicht auf die Geschichte (Ralf Muschall)
participants (7)
-
Bodo Kaelberer
-
David Haller
-
Joerg Rossdeutscher
-
Michael Matz
-
Ralf Schneider
-
Stefan Hundhammer
-
Werner Schalk