| Author |
Message |
|
|
Post subject: HTML-Seiten in CSV-Datei importieren?
Posted: Jun 06, 2008 - 04:42 AM
|
|

Joined: Dec 04, 2006
Posts: 72
Status: Offline
|
|
Halllo,
ich möchte eine umfangreiche statische Webseite in das CMS-System Joomla importieren. Dafür muss ich den TITLE-Tag- und BODY-Tag-Inhalt aller HTML-Seiten eines bestimmten Ordners in eine CSV-Datei schreiben. Jede Zeile der CSV-Datei entspricht dann einer importierten HTML-Datei.
Wie müsste ein Script aussehen, dass:
1) nacheinander alle HTML-Dateien eines Ordner abarbeitet
2) den Inhalt des TITLE-Tags (ohne den Tag selbst) als ersten Wert in eine neue Zeile der CSV-Datei schreibt
3) danach ein Trennzeichen einfügt, z.B. #
4) danach in dieselbe Zeile den Inhalt des BODY-Tags (also den HTML-Gehalt der Seite) in die Zeile schreibt - auch wieder ohne den Tag selbst.
5) sich dann die nächst HTML-Datei im Ordner vornimmt usw.?
Vielen Dank für eure Tipps!
cs |
_________________ Es gibt nichts Gutes,
außer man tut es.
(Erich Kästner)
|
| |
|
|
|
 |
|
|
Post subject:
Posted: Jun 22, 2008 - 05:07 PM
|
|
Joined: Dec 31, 2006
Posts: 7
Status: Offline
|
|
Hi,
da bietet sich Perl an, wenn auch nicht als Einzeiler :
Code:
#!/usr/bin/perl
use strict;
my $csv_sep = "#";
my $csv = "import.csv";
my $with_cr = 1;
my $line_sep = "\n";
$line_sep = " " if ! $with_cr;
open (CSV, ">$csv") || die "$csv: $!";
my (@html, $html, $body, $title);
while ($#ARGV >= 0){
my $fn = shift;
print $fn, "\n";
open (HTML, $fn) || die "$fn: $!";
@html = <HTML>;
close (HTML);
chomp(@html);
$html = join ("<!--!%?-->", @html);
$html =~ m!<title>(.*)</title>!i;
$title = $1;
$html =~ m!<body>(.*)</body>!i;
$body = $1;
$title =~ s/\<!--!%\?-->/$line_sep/g;
$body =~ s/\<!--!%\?-->/$line_sep/g ;
print CSV $title, $csv_sep, $body, "\n";
}
close CSV;
Wenn Du die Zeilenwechsel drin haben willst, dann passt es, ansonsten ersetze: $with_cr = 0;
Das Spalten-Trennsymbol kannst Du ändern: $csv_sep.
mfg
Hamatoma |
|
|
| |
|
|
|
 |
|
|
Post subject: Danke!
Posted: Jun 24, 2008 - 07:07 PM
|
|

Joined: Dec 04, 2006
Posts: 72
Status: Offline
|
|
Vielen Dank, Hamatoma, dass du mir weiterhilfst, obwohl das Thema einigermaßen "off topic" ist!
Es hat nicht gleich ganz so funktioniert, wie ich wollte (Title und Body wurden durch neue Zeile getrennt, HTML-Tags im Body wurden nicht entfernt).
Ich habe deshalb dein Perl-Script per Trial-and-Error modifiziert, sodass es bei zwei einfachen HTML-Dateien genau das macht, was ich will.
Das ist die modifizierte Version des Scripts:
Code:
#!/usr/bin/perl
use strict;
my $csv_sep = "#";
my $csv = "import.csv";
my $with_cr = 1;
open (CSV, ">$csv") || die "$csv: $!";
my (@html, $html, $body, $title);
while ($#ARGV >= 0){
my $fn = shift;
print $fn, "\n";
open (HTML, $fn) || die "$fn: $!";
@html = <HTML>;
close (HTML);
chomp(@html);
$html = join ("",@html);
$html =~ m!<title>(.*)</title>!i;
$title = $1;
$html =~ m!<body>(.*)</body>!i;
$body = $1;
# HTML-Tags werden aus dem Body entfernt
use HTML::Parse;
use HTML::FormatText;
$body = HTML::FormatText->new->format(parse_html($body));
print CSV $title,$csv_sep,$body;"\n"
}
close CSV;
Das ist HTML-Datei Nr. 1 "test.html":
Code:
<head>
<title>Das ist der Titel von HTML-Seite Nr. 1</title>
</head>
<body>
<p>Das ist der Text von HTML-Seite Nr. 1</p>
</body>
Und das ist HTML-Datei Nr. 2 "test1.html":
Code:
<head>
<title>Das ist der Titel von HTML-Seite Nr. 2</title>
</head>
<body>
<p>Das ist der Text von HTML-Seite Nr. 2</p>
</body>
Wenn ich das Script aufrufe, entsteht folgende CSV-Datei:
Code:
Das ist der Titel von HTML-Seite Nr. 1# Das ist der Text von HTML-Seite Nr. 1
Das ist der Titel von HTML-Seite Nr. 2# Das ist der Text von HTML-Seite Nr. 2
Was mich wundert, ist, warum nach dem Trennzeichen # drei Leerzeichen eingefügt werden. Könnte man die noch wegbekommen?
Gruß,
cs |
_________________ Es gibt nichts Gutes,
außer man tut es.
(Erich Kästner)
|
| |
|
|
|
 |
|
|
Post subject:
Posted: Jun 25, 2008 - 04:47 PM
|
|
Joined: Dec 31, 2006
Posts: 7
Status: Offline
|
|
Das mit dem Entfernen der Tags hatte ich überlesen
Aber hast Du ja bestens mittels CPAN gelöst!
Quote:
Was mich wundert, ist, warum nach dem Trennzeichen # drei Leerzeichen eingefügt werden. Könnte man die noch wegbekommen?
Meine Vermutung: Tags werden von vielen als Wort-Trennzeichen eingesetzt. Damit da nichts "kaputtgeht", ersetzt format() die Tags anscheinend durch jeweils ein Blank.
Zeilenwechsel werden vermutlich ebenfalls durch ' ' ersetzt.
Ist die Eingabedatei mit "DOS-"-Zeilenwechseln versehen, dann käme das 3. Blank vom CR.
Kannste aber ganz einfach loswerden:
Code:
$body =~ s/[ ][ ]+/ /;
Damit verschwinden alle Blanks nach einem Blank.
Führende Blanks entfernst Du mit
Code:
$body =~ s/^ +//;
mfg
Hamatoma |
|
|
| |
|
|
|
 |
|
|
|