Как добавить CSV-формат в LWP :: Simple

0

Относительно этого Target-Url учебная база данных по германии http://192.68.214.70/km/asps/schulsuche.asp?q=a&a=100&s=1750

этот целевой URL имеет сетку (или таблицу) - у меня есть код, который работает хорошо - но он не может обрабатывать сетку...

он выплевывает данные, подобные следующим...

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 

Это плохо - мне нужно иметь разделитель - как я могу получить некоторые разделители в результатах - либо запятыми или вкладками....?

Здесь код:

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

btw - см. один пример разделителей...:

my @cols = qw(
    rownum
    number
    name
    phone
    type
    website
);

my @fields = qw(
    rownum
    number
    name
    street
    postal
    town
    phone
    fax
    type
    website
);

note: это происходит от пользователя, который дал мне несколько замечаний в этой теме. Видеть HTML:: TableExtract: как запустить правильный аргумент [см. живой пример]

Ну, я хочу перенести идеи в вышеупомянутый паук и парсер. Возможно ли это... Можете ли вы дать мне несколько советов о том, как добавить некоторые строки кода, чтобы результаты выплевывались в csv-formate...!?

всякая помощь будет принята с благодарностью.

нулевым

Обновление: в соответствии с идеями muu слишком коротки...:

  #!/usr/bin/perl
    use strict;
    use warnings;
    use HTML::TableExtract;
    use LWP::Simple;
    use Text::CSV
    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);

            $csv->combine(@$row);
      print OUTFILE $csv->string();

          }
          $| = 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: $!";
       }
    }  

Обновление: Я провел несколько испытаний:

martin @suse-linux: ~/perl > perl perl_bayern_newstack.pl Непревзойденный (в регулярное выражение; отмеченный < - ЗДЕСЬ в m/l.*? (Treffer) (d +) (-) (d +) (< ЗДЕСЬ

что здесь не так...?

Теги:
csv
lwp

1 ответ

2

Вы должны использовать Text:: CSV для создания вашего вывода, что избавит вас от необходимости пытаться обрабатывать встроенные кавычки и разделители вручную, Итак, создайте экземпляр Text::CSV с вашими желаемыми параметрами и замените это:

print OUTFILE "@$row\n";

с

$csv->combine(@$row);
print OUTFILE $csv->string();

Где $csv - ваш экземпляр Text::CSV.

Кроме того, ваша функция cleanup немного сломана, она должна выглядеть так:

sub cleanup {
   for ( @_ ) {
      s/\s+/ /g;
   }
}

Недопустимый \ может быть только опечаткой, когда вы вставляли свой код, но, возможно, нет.

И не используйте прототипы, они не делают то, что вы, вероятно, думаете, что они делают. Где вы говорите:

sub cleanup() {

просто скажите

sub cleanup {

И не вызывайте функции с ведущим сигилом (т.е. не &workDir();, просто workDir(); будет делать), если вы не знаете, каковы его побочные эффекты.

  • 0
    привет мю слишком короткий! Большое спасибо за ответ. Это предлагает большую помощь. Теперь я пытаюсь сложить все вместе. Ваши советы отличные! Кстати - я был на вашем сайте. - Как то, что я вижу. Ваши пироги выглядят фантастически, а ваша философия убедительна! Продолжайте делать такие великие дела ... так как вы ангел для всех людей вокруг вас. Плз, продолжай делать такие великие дела ... и да, "делай, что [я] (я) могу, чтобы заполнить обувь бабушки". - много приветствий ноль
  • 0
    привет, мю слишком короткий: я сделал несколько испытаний martin @ suse-linux: ~ / perl> perl perl_bayern_newstack.pl Unmatched (в регулярном выражении; отмечен знаком <- ЗДЕСЬ в m /^.*? ) (-) (d +) (<- ЗДЕСЬ </ at perl_bayern_newstack.pl строка 41. martin @ suse-linux: ~ / perl> что здесь не так .. "?
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню