sidux.com
Menu

News

Give back
Last 3 Contributions
30-11-2008 20.00
25-11-2008 100.00
25-11-2008 20.00

Donate


Sponsor
hetzner.de

Languages
Preferred language:



Post new topic   Reply to topic
View previous topic Printable version Log in to check your private messages View next topic
Author Message
cs
Post subject: HTML-Seiten in CSV-Datei importieren?  PostPosted: 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)
 
 View user's profile Send private message  
Reply with quote Back to top
Hamatoma
Post subject:   PostPosted: 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 Very Happy :

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
 
 View user's profile Send private message  
Reply with quote Back to top
cs
Post subject: Danke!  PostPosted: 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)
 
 View user's profile Send private message  
Reply with quote Back to top
Hamatoma
Post subject:   PostPosted: Jun 25, 2008 - 04:47 PM



Joined: Dec 31, 2006
Posts: 7

Status: Offline
Das mit dem Entfernen der Tags hatte ich überlesen Evil or Very Mad
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
 
 View user's profile Send private message  
Reply with quote Back to top
Display posts from previous:     
Jump to:  
All times are GMT
Post new topic   Reply to topic
View previous topic Printable version Log in to check your private messages View next topic
Powered by PNphpBB2 © 2003-2007 The PNphpBB Group
Credits
 
Logos and trademarks are the property of their respective owners, comments are property of their posters, the rest is © 2006-2008 by sidux e.V., 10407 Berlin, Kniprodestr. 104. sidux e.V. is a Berlin, Germany based non-profit foundation. Consult Impressum and Legal Terms for details. sidux™ is Free Software released under the GNU/GPL license and other compatible licenses.
powered by Zikula & Zafenio