Как я могу извлечь содержимое определенной таблицы из источника HTML, используя Perl? - PullRequest
0 голосов
/ 16 октября 2010

Мне нужно проанализировать 5000 файлов - которые выглядят довольно идентично.

Мне нравится использовать HTML :: TokeParser :: Simple и DBI для выполнения анализа и сохранения результатов.

У меня мало опыта с HTML::TokeParser::Simple, но эта задача заканчивается моя голова. Примечание: я также взглянул на идеи - это тоже подходящее решение. Но на данный момент у меня есть проблемы с получением соответствующих xpath-выражений: я попытался определить соответствующие xpath-выражения, которые нужно заполнить в Perl-программе.

Это то, что у меня сейчас есть:

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;

с этим все в порядке? Примечание. Я хочу сохранить это в базе данных.

Кстати: см. Один из примеров сайтов:

http://www.kultusportal -bw.de / сервлет / PB / меню / 1188427 / index.html? COMPLETEHREF = http://www.kultus -bw.de / did_abfrage / detail.php? ID = 04313488

в блоке, выделенном серым цветом, вы видите нужную информацию: 17 искомых строк Обратите внимание - у меня есть 5000 различных HTML-файлов, которые структурированы одинаково!

Это означает, что я был бы рад иметь шаблон, который может быть запущен с HTML :: TokeParser :: Simple и DBI.

Могу ли я использовать вышеупомянутый код ... или я должен изменить его.

Рад тебя слышать! Это было бы здорово !!

1 Ответ

3 голосов
/ 16 октября 2010

Использовать немного HTML :: TableExtract magic:

#!/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;
    }
}

Вывод:

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) 

Конечно, я сохранил локальную копию страницы перед запускомсценарий.

...