Filtern von Informationen aus einer Html Datei in eine csv

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
viper2k
Beiträge: 51
Registriert: 11.01.2006 02:49:11
Wohnort: Berlin
Kontaktdaten:

Filtern von Informationen aus einer Html Datei in eine csv

Beitrag von viper2k » 03.05.2006 22:38:14

Kann mir jeamand bei einem Script helfen um Daten(Adressen aus einer html Seite zu filtern? So das ich diese in OpenOffice Calc als Tabelle dann importieren kann? Eine .csv Datei?

Das ist eine Ausschnitt aus einer html datei:

Code: Alles auswählen

<tr align="left" valign="top"> 
          <td class="left" width="38%">Iran Abadkon-Zielasko
<br>Zahnärztin<br>
            Telefon 8 52 69 65</td>

          <td class="middle" width="39%">Frau<br>
              Iran Abadkon-Zielasko
<br>Zahnärztin<br>
              Niedstr. 22<br>
              12159 Berlin–Schön<tr align="left" valign="top"> 
          <td class="left" width="38%">Iran Abadkon-Zielasko
<br>Zahnärztin<br>
            Telefon 8 52 69 65</td>

          <td class="middle" width="39%">Frau<br>
              Iran Abadkon-Zielasko
<br>Zahnärztin<br>
              Niedstr. 22<br>
              12159 Berlin–Schöneberg</td>

          <td class="right" width="23%"> 
              <a target="stadtplan" href="http://www.berlin.de/stadtplan/explorer?ADR_ZIP=12159&ADR_STREET=Niedstr.&ADR_HOUSE=22">Stadtplan</a> 
          </td>
        </tr>
        <tr>
          <td colspan="3" class="line">&nbsp;</td>
        </tr>

        <tr align="left" valign="top"> 
          <td class="left" width="38%">Masses Abdalian Chigani
<br>Zahnarzt<br>
            Telefon 7 96 54 40</td>

          <td class="middle" width="39%">Herrn<br>
              Masses Abdalian Chigani
<br>Zahnarzt<br>
              Steglitzer Damm 33<br>
              12169 Berlin–Steglitz</td>

          <td class="right" width="23%"> 
              <a target="stadtplan" href="http://www.berlin.de/stadtplan/explorer?ADR_ZIP=12169&ADR_STREET=Steglitzer+Damm&ADR_HOUSE=33">Stadtplan</a> 
          </td>
        </tr>
        <tr>
          <td colspan="3" class="line">&nbsp;</td>
        </tr>

Also der erste Eintrag sollte dann so in der csv ca. rauskommen:

Anrede;Name;Vorname;Straße;PLZ;Ort;Geschlecht;Telefonnr;
;Abadkon-Zielasko;Iran;Niedstr.22;12159;Berlin;Zahnärztin;8 52 69 65

Thx
viper

ToPeG
Beiträge: 437
Registriert: 14.04.2004 00:42:06

Beitrag von ToPeG » 04.05.2006 01:24:16

versuch mal das:

Code: Alles auswählen

#!/usr/bin/perl

use strict;
my @liste;

open(IN,'<',$ARGV[0]) or die "Konnte \"$ARGV[0]\" nicht öffnen ($!)\n";
my $in=join('',(<IN>));
close(IN);

while($in=~m|<td class="left".+?>(.+?)</td>.+?<td class="middle".+?>(.+?)</td>|s)
{
 $in=$';
 my $found1=$1;
 my $found2=$2;

 $found1=~s|<br>||sg;
 $found1=~s|\n|;|sg;
 $found1=~s|\s{2,}||sg;

 $found2=~s|<br>||sg;
 $found2=~s|\n|;|sg;
 $found2=~s|\s{2,}||sg;

 my $telnr=(split(';',$found1))[-1];
 $telnr=~s|^.+?(\d[\s\d]+\d).+?$|$1|g;
 my ($anr,$name,$beruf,$str,$ort)=split(';',$found2);
 $name=~s|^(.+)\s(.+?)$|$2|s;
 my $vname=$1;
 my $geschl='';
 if($anr=~m|herr|i && $beruf!~m|in$|)
 { $geschl='männlich'; }
 else
 { $geschl='weiblich'; }
 push(@liste,[$anr,$name,$vname,$str,$ort,$geschl,$telnr]);
}

print "Anrede;Name;Vorname;Straße;PLZ;Ort;Geschlecht;Telefonnr\n";
print join("\n",grep{$_=join(';',@{$_})}@liste)."\n";
exit;
Aufruf:
perl pfad/zum/script pfad/zur/htmlseite
oder wenn die Scriptdatei als auführbar markiert ist:
./<scriptname> pfad/zur/htmlseite

Das Spukt dir eine CSV-Datei mit ";" als spaltentrenner und "\n" als Zeilentrenner aus. (vorausgesetzt es funktioniert... Das gepostete HTML ist nicht ganz sauber formatiert, was, daran liegen kann, daß du es zusammenkopiert hast.)

viper2k
Beiträge: 51
Registriert: 11.01.2006 02:49:11
Wohnort: Berlin
Kontaktdaten:

Beitrag von viper2k » 04.05.2006 14:26:37

Na das sieht ja schon gut aus.

Bekomme nur jetzt ein paar Fehlerausgaben was sicherlich mit der Formatierung zusammenhängt. Wäre schön wenn das noch wegkommt und zwar:

Anrede;Name;Vorname;Straße;PLZ;Ort;Geschlecht;Telefonnr
Seite 1 von 2;;;;;weiblich;</select>
Frau;dentariae;doctor medicinae;Zahnärztin;Falkenseer Chaussee 268;weiblich;3 72
34 8
Herrn;Bieber;Siegfried;Breite Str. 64;13597 Berlin–männlich;3 33 67 4
Herrn;Bleyzer;Michael;Falkenseer Chaussee 36;13583 Berlin–männlich;372 18
7
Gemeinschaftspraxis;Blume-Kotzur;Dr. Karin;FZÄ. f. Kieferorthopädie;Seeburger St
r. 3;weiblich;3 31 30 1
Gemeinschaftspraxis;Bodenstein;Dres. Felix u. Cornelia; Gabriele Janeczek;Zahnär
zte;weiblich;3 33 32 1
Gemeinschaftspraxis;Bodenstein;Dres. Felix u. Cornelia; Gabriele Janeczek;Zahnär
zte;weiblich;3 33 32 1

Also manchmal kommen die PLZ rein und manchmal wird das gemixt.....

und das &#8211 soll auch weg.

Hmm wäre vielleicht besser wenn ich dir die html Datei mal schicke oder? Dann kannst Du es besser nachvollziehen was er macht.
Und noch das er es gleich direkt in eine datei schreibt nach export.csv oder so.
Jetzt zeit er mir es ja nur auf dem Bildschirm an.

Danke aber schon mal für deine Hilfe

viper

nepos
Beiträge: 5238
Registriert: 05.01.2005 10:08:12

Beitrag von nepos » 04.05.2006 15:33:25

Vielleicht waers auch besser, gleich ein Perl-Modul zum Parsen von HTML-Code zu nutzen. Z.B. koennte HTML::Parser einen Blick wert sein.
Das Parsen von HTML mit regulaeren Ausdruecken ist - leider - sehr fehleranfaellig und im Allgemeinen wird davon deshalb auch eher abgeraten.

ToPeG
Beiträge: 437
Registriert: 14.04.2004 00:42:06

Beitrag von ToPeG » 05.05.2006 03:27:47

@viper2k
Ja eine vollständige Seite wäre nicht schlecht. Lade es mal mit http://nopaste.debianforum.de/ hoch und poste den Link darauf hier.

@nepos
Es kommt immer darauf an was man will. In Fällen wie diesem ist es meiner Meinung nach aufwändiger sich durch den geparsten HTML-Tree zu hangeln, als genau nach einer Ausdruckfolge zu suchen (das war jetzt ein 15 Minuten Script). Zumal hier nach zwei aufeinander folgenden Tags gesucht wird und mich die struktur des HTML nur maginal interessiert. Das ist, so meine ich mit HTML::Parser komplizierter. Wären die Daten Über HTML logisch geordnet und sollte das Script an unterschiedlichen Seiten angewendet werden, so wäre es sicher einfacher HTML::Parser zu verwenden.

nepos
Beiträge: 5238
Registriert: 05.01.2005 10:08:12

Beitrag von nepos » 05.05.2006 16:11:30

War ja auch nur ein Vorschlag :)
Bekanntlich gibts immer mehrere Wege, das gleiche zu tun ;)

viper2k
Beiträge: 51
Registriert: 11.01.2006 02:49:11
Wohnort: Berlin
Kontaktdaten:

Beitrag von viper2k » 06.05.2006 12:46:10

okay habe die komplette liste mal gepastet:


http://nopaste.php-q.net/210275


Thx

ToPeG
Beiträge: 437
Registriert: 14.04.2004 00:42:06

Beitrag von ToPeG » 06.05.2006 14:53:59

Die Ausgabe erfolgt in eine Datei die mit angeben werden muss.

Code: Alles auswählen

./scriptname /pfad/zur/eingabedatei.html /pfad/zur/ausgabedatei.csv
Allso hier mal das geändert Script

Edit by Snoopy:
Code-Tags für die Leserlichkeit eingefügt.
Zuletzt geändert von ToPeG am 07.05.2006 00:49:33, insgesamt 1-mal geändert.

viper2k
Beiträge: 51
Registriert: 11.01.2006 02:49:11
Wohnort: Berlin
Kontaktdaten:

Beitrag von viper2k » 06.05.2006 16:22:05

Bekomme jetzt einen Fehler:

./extract /home/benjamin/Desktop/spandau.html /home/benjamin/Desktop/spandau.csv
Quantifier follows nothing in regex; marked by <-- HERE in m/? <-- HERE / at ./extract line 18.

ToPeG
Beiträge: 437
Registriert: 14.04.2004 00:42:06

Beitrag von ToPeG » 06.05.2006 17:41:44

Die Zeile:

Code: Alles auswählen

$in=~s|–|-|gs;
müßte igendlich so aussehen:

Code: Alles auswählen

$in=~s|&#8211\;|-|gs;
Der Fehler liegt an der automatischen Umwandlung von HTML-Kodiereten Umlauten im Browser.

viper2k
Beiträge: 51
Registriert: 11.01.2006 02:49:11
Wohnort: Berlin
Kontaktdaten:

Beitrag von viper2k » 06.05.2006 22:17:53

Sieht schon sehr gut aus...aber hast du dir mal die CSV Datei angeschaut? Es wird trotzdem viel durcheinander gehauen.

Aber danke schon mal für die Hilfe.

big thx

ToPeG
Beiträge: 437
Registriert: 14.04.2004 00:42:06

Beitrag von ToPeG » 07.05.2006 00:44:01

Sicher habe ich das! Was verstehst du bitte unter "durcheinander gehauen"?
Ich habe keine Fehlerhaften Einträge gesehen, die nicht auf ein abweichendes Format auf der HTML-Seite zurückzuführen ist. Ganz ohne Handarbeit wird es sowiso nicht gehen, da hier kein strenges Format gibt, das eingehalten werden muß.
Mehr kann man automatisch kaum raus holen. Allso nicht undankbar sein...

viper2k
Beiträge: 51
Registriert: 11.01.2006 02:49:11
Wohnort: Berlin
Kontaktdaten:

Beitrag von viper2k » 07.05.2006 11:37:51

Nein wollte ja nicht undankbar sein. Danke für deine schnelle und sehr gute Lösung :-)

Werde mich mal drann setzen und ein bisschen hin und her kopieren :-))))



Big thx

Antworten