2010-10-16 17 views
0

Je dois analyser 5000 fichiers - qui semblent assez identiques. J'aime utiliser HTML::TokeParser::Simple et DBI pour effectuer le travail d'analyse et stocker les résultats. J'ai peu d'expérience avec HTML::TokeParser::Simple mais cette tâche dépasse ma tête. Note: j'ai également jeté un coup d'oeil aux idées - cela semble être également une manière appropriée. Mais pour le moment j'ai des problèmes pour obtenir les expressions xpath correspodantes: J'ai essayé de déterminer les expressions xpath correspondantes qui doivent être remplies dans le programme Perl.Comment puis-je extraire le contenu d'une table spécifique à partir d'une source HTML en utilisant Perl?

C'est ce que j'ai en ce moment:

use strict; 

use HTML::TreeBuilder::XPath; 

my $tree = HTML::TreeBuilder::XPath->new; 

#use real file name here 
open(my $fh, "<", "file.html") or die $!; 

$tree->parse_file($fh); 

my ($name)  = $tree->findnodes(qq{/html/body/table/tr[1]/td[2]}); 
my ($type)  = $tree->findnodes(qq{/html/body/table/tr[1]/td[2]}); 
my ($adress)  = $tree->findnodes(qq{/html/body/table/tr[1]/td[2]}); 
my ($adress_two) = $tree->findnodes(qq{/html/body/table/tr[1]/td[2]}); 
my ($telephone) = $tree->findnodes(qq{/html/body/table/tr[1]/td[2]}); 
my ($fax) = $tree->findnodes(qq{/html/body/table/tr[1]/td[2]}); 
my ($internet) = $tree->findnodes(qq{/html/body/table/tr[1]/td[2]}); 
my ($officer) = $tree->findnodes(qq{/html/body/table/tr[1]/td[2]}); 
my ($employees) = $tree->findnodes(qq{/html/body/table/tr[1]/td[2]}); 
my ($offices) = $tree->findnodes(qq{/html/body/table/tr[1]/td[2]}); 
my ($worker)  = $tree->findnodes(qq{/html/body/table/tr[1]/td[2]}); 
my ($country) = $tree->findnodes(qq{/html/body/table/tr[1]/td[2]}); 
my ($the_council)= $tree->findnodes(qq{/html/body/table/tr[1]/td[2]}); 


print $name->as_text; 
print $type->as_text; 
print $adress->as_text; 
print $adress_two->as_text; 
print $telephone->as_text; 
print $fax->as_text; 
print $internet->as_text; 
print $officer->as_text; 
print $employees->as_text; 
print $offices->as_text; 
print $worker->as_text; 
print $country->as_text; 
print $the_council->as_text; 

est ce bien? Note - Je voudrais stocker ceci dans une base de données.

BTW: Voir un des exemples les sites:

http://www.kultusportal-bw.de/servlet/PB/menu/1188427/index.html?COMPLETEHREF=http://www.kultus-bw.de/did_abfrage/detail.php?id=04313488

dans le bloc gris ombré vous voyez les informations recherchées: 17 lignes qui sont recherchés. Note - j'ai 5000 fichiers HTML différents - qui sont tous structurés de la même manière!

Cela signifie que je serais heureux d'avoir un modèle qui peut être exécuté avec HTML :: TokeParser :: Simple et DBI. Puis-je utiliser le code mentionné ci-dessus ... ou dois-je le changer.

L'amour pour avoir de vos nouvelles! Ce serait génial!!

+0

FYI: J'ai essayé de modifier votre question, mais je ne comprends pas le titre. S'il vous plaît, essayez de trouver quelque chose de descriptif. –

+1

Voir aussi http://stackoverflow.com/q/3946874/100754 –

Répondre

3

Utilisez une HTML::TableExtract magique:

#!/usr/bin/perl 

use strict; use warnings; 
use HTML::TableExtract; 
use YAML; 

my $te = HTML::TableExtract->new(attribs => { 
    border => 0, 
    bgcolor => '#EFEFEF', 
    leftmargin => 15, 
    topmargin => 5, 
}); 

$te->parse_file('kultus-bw.html'); 
my ($table) = $te->tables; 

for my $row ($table->rows) { 
    cleanup(@$row); 
    print "@$row\n"; 
} 

sub cleanup { 
    for (@_) { 
     s/\s+//; 
     s/[\xa0 ]+\z//; 
     s/\s+/ /g; 
    } 
} 

Sortie:

Schul-/Behördenname: Abendgymnasium Ostwürttemberg 
Schulart: Privatschule (04313488) 
Hausadressse: Friedrichstr.70, 73430 Aalen 
Postfachadresse: Keine Angabe 
Telefon: 07361/680040 
Fax: 07361/680040 
E-Mail: Keine Angabe 
Internet: www.abendgymnasium-ostwuerttemberg.de 
ÜbergeordneteDienststelle: Regierungspräsidium Stuttgart Abteilung 7 Schule und Bildung 
Schulleitung: Keine Angabe 
Stellv.Schulleitung: Keine Angabe 
AnzahlSchüler: 259 
AnzahlKlassen: 8 
AnzahlLehrer: Keine Angabe 
Kreis: Ostalbkreis 
Schulträger: <Verband/Verein> (Verband/Verein) 

Bien sûr, je sauvé une copie locale de la page avant d'exécuter le script.

+0

Bonjour Sinan Ünür, c'est génial. Vous avez fait plus que prévu. Je suis très heureux. C'est exactement ce que je veux avoir comme résultat. Je suis accablé. Ce code que vous suggérez fait tout le tour! – zero

+0

Encore une fois Sinan Ünur, je suis excité. Je dois comprendre le code. Vous obtenez de bonnes sorties. Et j'aime comprendre ce code génial - qui est capable de donner cet ouutut! Bon travail. - Je reviens plus tard ce jour. Maintenant, j'ai quitté la maison pendant deux heures. Mais chose sûre je reviens! Merci beaucoup encore! Salutations martin – zero

+0

encore moi - essayé de corriger le titre de fil. Le système a nié cela puisque je suis un nouvel utilisateur. Martin – zero