HTML Eintraege aufteilen

21/03/2010 - 22:04 von Christian Meier | Report spam
Hallo,

habe eine HTML-Datei mit verschiedenen Eintràgen. Jeder Eintrag beginnt mit
<a NAME=1>, wobei die eins hochgezàhlt wird:

<A NAME=1><H1>Computer</H1><UL>
<LI> Eintrag über blablabla
<A NAME=2><H2>Datenschutz</H2><UL>
<LI> ein weiterer Eintrag
<A NAME=3><H3>Alexa</H3><UL>
<LI> nochmal ein Eintrag
<A NAME=4>ein weiterer
<BR><BR><BR><P></LI></UL></LI><LI>
<A NAME=5><H3>Firefox</H3><UL>
<LI> hier steht weiterer Text

Ich möchte jetzt ein Script schreiben, das jeden Eintrag in eine eigene
Textdatei schreibt. Die HTML-Tags sollen gelöscht werden, als Dateiname
würde sich die Nummer des Eintrags anbieten. Soweit bin ich aber noch lang
nicht. Das Problem ist schon, die einzelnen Eintràge überhaupt zu trennen.

Mein Ansatz war:
#!/usr/bin/perl
open(MUSTER, "<export.htm") || die "Lese Fehler $! ";
@zeilen=<MUSTER>;
#@zeilen = chomp;
close(MUSTER);
$i = 0;
foreach my $zeile(@zeilen) {
$i++;
shift @zeilen;

if($zeile =~ /<A NAME=(\d+)>/) {
#print "Treffer |$`>$&<$'|";
push @eintrag, "$'|";
} else {
push @eintrag, $zeile;
} }
foreach my $ergebnis(@eintrag) {
print $ergebnis;
print " --";
}

Ausgabe:
<H1>Computer</H1><UL>
|
<H2>Datenschutz</H2><UL>
|
<H3>Alexa</H3><UL>
|
ein weiterer
|
<H3>Firefox</H3><UL>
|

Verschiedene Versuche mit split oder das hier
while (/<A NAME=(\d+)>(.*)<A NAME.*/s/g )
{
print "$1 $2 ";
}
sind auch gescheitert.

Wie gehe ich am besten vor? Wie müsste ein regulàrer Ausdruck lauten? Wie
speichere ich die Ausgabe? Ist die zeilenweise Abarbeitung überhaupt
geeignet?


- Christian
 

Lesen sie die antworten

#1 Wolf Behrenhoff
21/03/2010 - 23:41 | Warnen spam
Christian Meier schrieb:
Hallo,

habe eine HTML-Datei mit verschiedenen Eintràgen. Jeder Eintrag beginnt mit
<a NAME=1>, wobei die eins hochgezàhlt wird:

Ich möchte jetzt ein Script schreiben, das jeden Eintrag in eine eigene
Textdatei schreibt. Die HTML-Tags sollen gelöscht werden, als Dateiname
würde sich die Nummer des Eintrags anbieten. Soweit bin ich aber noch lang
nicht. Das Problem ist schon, die einzelnen Eintràge überhaupt zu trennen.



Hm, sollen alle HTML-Tags weg oder nur das <a name>? Und dann stellt
sich mir erstmal die Frage: musste man <a nicht auch schließen? Ich sehe
aber kein </a> bei dir. Wenn du generell alle Tags weghaben willst, dann
siehe

perldoc -q "How do I remove HTML from a string"

Wenn die Datei immer so einfach ausgebaut ist wie in deinem Beispiel,
kannst du sie sehr einfach an den <a name trennen. Ich würde die gesamte
Datei auf einmal einlesen, nicht zeilenweise arbeiten.

8<-
use strict;
use warnings;

$_ = do { local $/; <DATA> };
my @matches = m!<a name=(\d)>(.*?)(?=<a name=|\z)!sig;

use Data::Dumper;
print Dumper \@matches;

__DATA__
<A NAME=1><H1>Computer</H1><UL>
<LI> Eintrag über blablabla
<A NAME=2><H2>Datenschutz</H2><UL>
<LI> ein weiterer Eintrag
<A NAME=3><H3>Alexa</H3><UL>
<LI> nochmal ein Eintrag
<A NAME=4>ein weiterer
<BR><BR><BR><P></LI></UL></LI><LI>
<A NAME=5><H3>Firefox</H3><UL>
<LI> hier steht weiterer Text
8<-

Kommt da das raus, was du willst? (im Array sind abwechselnd die Zahl
und der Inhalt) Ansonsten noch beachten, dass schon ein '<a name="1">'
hier nicht mehr matchen würde. Also, wenn die Datei sich auch mal àndern
kann, dann kommst du mit REs irgendwann nicht mehr gut weiter.

- Wolf

Ähnliche fragen