2010-10-16 3 views
0

Мне нужно разобрать 5000 файлов, которые выглядят довольно идентичными.Как я могу извлечь содержимое конкретной таблицы из источника HTML с помощью Perl?

Мне нравится использовать 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/servlet/PB/menu/1188427/index.html?COMPLETEHREF=http://www.kultus-bw.de/did_abfrage/detail.php?id=04313488

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

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

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

Любовь к вам услышать! Это было бы прекрасно!!

+0

FYI: Я попытался изменить ваш вопрос, но я не могу понять смысл названия. Попробуйте придумать что-нибудь описательное. –

+1

См. Также http://stackoverflow.com/q/3946874/100754 –

ответ

3

Использование некоторых HTML::TableExtract магии:

#!/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) 

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

+0

Привет, Sinan Ünür, это здорово. Вы сделали больше, чем ожидали. Я очень счастлив. Это именно то, что я хочу получить в результате. Я переполнен. Этот код, который вы предлагаете, делает весь трюк! – zero

+0

Снова Синан Юнур, я взволнован. Я должен понять код. Вы получаете отличные результаты. И я люблю понимать этот замечательный код, который способен дать этот вывод! Отличная работа. - Я возвращаюсь позже в этот день. Теперь я ухожу из дома на два часа. Но верная вещь, я вернусь! Еще много спасибо! Привет, martin – zero

+0

снова меня - попытался исправить нить-заголовок. Система отрицала это, так как я новый пользователь. Martin – zero

Смежные вопросы