【问题标题】:How to add CSV-format to LWP::Simple如何将 CSV 格式添加到 LWP::Simple
【发布时间】:2011-06-30 21:33:37
【问题描述】:

关于这个 Target-Url 德国学校数据库http://192.68.214.70/km/asps/schulsuche.asp?q=a&a=100&s=1750

这个目标网址有一个网格-(或表格)-我有一个运行良好的代码-但它无法处理网格...

它会吐出如下数据...

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

顺便说一句 - 请参阅分隔符的一个示例...:

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

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

注意:这源于一个用户,他在这个线程上给了我一些很好的提示。看 HTML::TableExtract: how to run the right argument [see live example]

嗯-我想将这些想法迁移到上面提到的蜘蛛和解析器中。这可能吗..你能给我一些提示如何添加一些代码行 - 以便结果以 csv 格式吐出......!?

任何和所有的帮助将不胜感激..

更新:按照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 不匹配(在 正则表达式;由

这里有什么问题...?

【问题讨论】:

    标签: mysql perl csv lwp


    【解决方案1】:

    您应该使用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 {
    

    除非你知道它的副作用是什么,否则不要调用带有前导符号的函数(即不要 &amp;workDir();,只需 workDir(); 会这样做)。

    【讨论】:

    • 你好mu太短了!非常感谢您的回答。这提供了很大的帮助。我现在尝试将点点滴滴地添加到整个事物中。你的建议很棒!顺便说一句-我在你的网站上。-就像我看到的那样。你的馅饼看起来棒极了,你的哲学令人信服!继续做这些伟大的事情......因为你是你周围所有人的天使。请继续做如此伟大的事情......是的,“做[ya](我)可以做的事情来填补奶奶的鞋子。” - 许多问候零
    • hello mu 太短了:我做了一些试验 martin@suse-linux:~/perl> perl perl_bayern_newstack.pl 不匹配(在正则表达式中;由 )(d+)( - )(d+)( 这里有什么问题.."?
    • @zero:看起来你有“(&lt;/b&gt; ”,问题不是“(”,问题是“/b”中的斜线,你想要“(&lt;\/b&gt; ” .
    • @mu 太短了:我会仔细看看——我明天回来报告我所有的发现。。到目前为止,非常感谢!你很棒!! - 许多问候惠斯勒;-)
    • @mu 太短:试图修复 - 但现在我有以下内容:martin@suse-linux:~/perl> perl perl_bayern_newstack.pl 全局符号“$csv”需要显式包名称perl_bayern_newstack.pl 第 59 行。全局符号“$csv”需要在 perl_bayern_newstack.pl 第 60 行显式的包名称。perl_bayern_newstack.pl 的执行由于编译错误而中止。嗯 - 这可能是什么”?是什么导致了错误?这让我有点不知所措。你能帮我写代码 - 也许把它放在一起。那将非常非常支持......提前谢谢 - 很多人向惠斯勒 - 零
    猜你喜欢
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 2021-06-08
    • 2011-09-22
    • 1970-01-01
    • 2020-10-27
    • 2020-06-09
    相关资源
    最近更新 更多