Я сейчас работаю над небольшим парсером.
У меня были очень хорошие результаты с первым скриптом! Это было в состоянии бежать отлично!
Извлекает данные со страницы: http://192.68.214.70/km/asps/schulsuche.asp?q=n&a=20
(примечание 6142 записей) - Но обратите внимание - данные не разделены, поэтому последующая работа с данными немного сложна. Поэтому у меня есть второй скрипт - см. Ниже!
Примечание - друзья помогли мне с обоими сценариями. Мне нужно представиться как настоящий новичок, которому нужна помощь в миграции два в одном. Итак, вы видите, мой Perl-knowlgedge не настолько проработан, что я могу выполнить миграцию в одну самостоятельно! Любая помощь будет отличной!
Первый скрипт: паук и парсер: он выплевывает данные следующим образом:
lfd. Nr. Schul- nummer Schulname Straße PLZ Ort Telefon Fax Schulart Webseite
1 0401 Mädchenrealschule Marienburg, Abenberg, der Diözese Eichstätt Marienburg 1 91183 Abenberg 09178/509210 Realschulen mrs-marienburg.homepage.t-online.de
2 6581 Volksschule Abenberg (Grundschule) Güssübelstr. 2 91183 Abenberg 09178/215 09178/905060 Volksschulen home.t-online.de/home/vs-abenberg
3 6913 Mittelschule Abenberg Güssübelstr. 2 91183 Abenberg 09178/215 09178/905060 Volksschulen home.t-online.de/home/vs-abenberg
4 0402 Johann-Turmair-Realschule Staatliche Realschule Abensberg Stadionstraße 46 93326 Abensberg 09443/9143-0,12,13 09443/914330 Realschulen www.rs-abensberg.de
Но мне нужно разделить данные: запятыми или что-то в этом роде!
И у меня есть второй сценарий. Эта часть может сделать CSV-формат. Я хочу объединить это с логикой паука. Но сначала давайте взглянем на первый сценарий: с великолепной логикой-пауком.
см. Соответствующий код:
#!/usr/bin/perl
use strict;
use warnings;
use HTML::TableExtract;
use LWP::Simple;
use Cwd;
use POSIX qw(strftime);
my $te = HTML::TableExtract->new;
my $total_records = 0;
my $suchbegriffe = "e";
my $treffer = 50;
my $range = 0;
my $url_to_process = "http://192.68.214.70/km/asps/schulsuche.asp?q=";
my $processdir = "processing";
my $counter = 50;
my $displaydate = "";
my $percent = 0;
&workDir();
chdir $processdir;
&processURL();
print "\nPress <enter> to continue\n";
<>;
$displaydate = strftime('%Y%m%d%H%M%S', localtime);
open OUTFILE, ">webdata_for_$suchbegriffe\_$displaydate.txt";
&processData();
close OUTFILE;
print "Finished processing $total_records records...\n";
print "Processed data saved to $ENV{HOME}/$processdir/webdata_for_$suchbegriffe\_$displaydate.txt\n";
unlink 'processing.html';
die "\n";
sub processURL() {
print "\nProcessing $url_to_process$suchbegriffe&a=$treffer&s=$range\n";
getstore("$url_to_process$suchbegriffe&a=$treffer&s=$range", 'tempfile.html') or die 'Unable to get page';
while( <tempfile.html> ) {
open( FH, "$_" ) or die;
while( <FH> ) {
if( $_ =~ /^.*?(Treffer <b>)(d+)( - )(d+)(</b> w+ w+ <b>)(d+).*/ ) {
$total_records = $6;
print "Total records to process is $total_records\n";
}
}
close FH;
}
unlink 'tempfile.html';
}
sub processData() {
while ( $range <= $total_records) {
getstore("$url_to_process$suchbegriffe&a=$treffer&s=$range", 'processing.html') or die 'Unable to get page';
$te->parse_file('processing.html');
my ($table) = $te->tables;
for my $row ( $table->rows ) {
cleanup(@$row);
print OUTFILE "@$row\n";
}
$| = 1;
print "Processed records $range to $counter";
print "\r";
$counter = $counter + 50;
$range = $range + 50;
$te = HTML::TableExtract->new;
}
}
sub cleanup() {
for ( @_ ) {
s/s+/ /g;
}
}
sub workDir() {
# Use home directory to process data
chdir or die "$!";
if ( ! -d $processdir ) {
mkdir ("$ENV{HOME}/$processdir", 0755) or die "Cannot make directory $processdir: $!";
}
}
Но так как этот вышеприведенный скрипт-unfortunatley не заботится о разделителях, мне пришлось позаботиться о методе, который ищет разделители. Для того, чтобы получить данные (вывод) разделены.
Так что с разделением я могу работать с данными - и сохранять их в mysql-таблице ... или делать что-то еще ... Так что здесь [ниже] есть биты - которые работают с csv-formate Note - Я хочу поместить приведенный ниже код в приведенный выше код - объединить паутинную логику вышеупомянутого кода с логикой вывода данных в формате CSV.
где установить в коде Вопрос: можем ли мы определить эту точку для переноса одной в другую ...!?
Это было бы удивительно ... Я надеюсь, что смогу прояснить, что я имею в виду ...!? Можем ли мы использовать преимущества обеих частей (/ скриптов), переводя их в одну?
Таким образом, вопрос заключается в следующем: где установить скрипт в CSV-скрипт (см. Выше)
#!/usr/bin/perl
use warnings;
use strict;
use LWP::Simple;
use HTML::TableExtract;
use Text::CSV;
my $html= get 'http://192.68.214.70/km/asps/schulsuche.asp?q=a&a=20';
$html =~ tr/\r//d; # strip carriage returns
$html =~ s/ / /g; # expand spaces
my $te = new HTML::TableExtract();
$te->parse($html);
my @cols = qw(
rownum
number
name
phone
type
website
);
my @fields = qw(
rownum
number
name
street
postal
town
phone
fax
type
website
);
my $csv = Text::CSV->new({ binary => 1 });
foreach my $ts ($te->table_states) {
foreach my $row ($ts->rows) {
# trim leading/trailing whitespace from base fields
s/^\s+//, s/\s+$// for @$row;
# load the fields into the hash using a "hash slice"
my %h;
@h{@cols} = @$row;
# derive some fields from base fields, again using a hash slice
@h{qw/name street postal town/} = split /\n+/, $h{name};
@h{qw/phone fax/} = split /\n+/, $h{phone};
# trim leading/trailing whitespace from derived fields
s/^\s+//, s/\s+$// for @h{qw/name street postal town/};
$csv->combine(@h{@fields});
print $csv->string, "\n";
}
}
Дело в том, что у меня были очень хорошие результаты с первым скриптом! Извлекает данные со страницы: http://192.68.214.70/km/asps/schulsuche.asp?q=n&a=20
(примечание 6142 записей) - Но обратите внимание - данные не разделены ...!
И у меня есть второй сценарий. Эта часть может сделать CSV-формат. я хочу совместить это с логикой паука.
где часть для вставки? Я с нетерпением жду любой помощи.
если мне нужно быть более осторожным - просто дайте мне знать ...