【问题标题】:HTML::TableExtract: how to run the right argument [see live example]HTML::TableExtract:如何运行正确的参数 [查看实时示例]
【发布时间】:2011-02-19 23:13:07
【问题描述】:

关于解析器的问题。是否有机会在分隔表的部分中捕获一些分隔符... paser 脚本运行良好。注意 - 我想将数据存储到 MySQL 数据库中。所以有一些分隔符会很棒 - (逗号,制表符或其他一些 - 制表符分隔值或逗号分隔值 是使用方便的格式...

(此处数据来自以下站点:http://192.68.214.70/km/asps/schulsuche.asp?q=a&a=20

lfd。编号。 Schulnummer Schulname Straße PLZ Ort 电话传真 Schulart 网站 1 0401 Mädchenrealschule 马林堡,阿本贝格,德迪奥泽斯 艾希施泰特马林堡 1 91183 阿贝贝格 09178/509210 Realschulen mrs-marienburg.homepage.t-online.de 2 6581 大众学校 Abenberg (Grundschule) Güssübelstr. 2 91183 阿贝贝格 09178/215 09178/905060 大众学校 home.t-online.de/home/vs-abenberg 6 第3074章 松德帕德。 Förderung, Förderschwerpunkt Lernen, 阿本斯贝格 雷根斯堡大街 60 93326 阿本斯贝格 09443/709191 09443/709193 Berufsschulen zur sonderpädog。 Förderung www.berufsschule-abensberg.de

嗯,我需要将这些行分成至少三列 - 取第一条记录。

名称:Volksschule Abenberg (Grundschule) 街: Güssübelstr. 2 邮政编码和城镇: 91183 Abenberg 传真和电话: 09178/215 09178/905060 型 学校: Volksschulen 网站: home.t-online.de/home/vs-abenberg

或者更好 - 我已经将邮政编码和城镇分成了两列!? 问:这可能吗?

顺便说一句:见第一条记录:(这里只显示学校的名字)

1 0401 Mädchenrealschule Marienburg, Abenberg, 6 3074 私人 Berufsschule zur sonderpäd。 Förderung, Förderschwerpunkt Lernen, 阿本斯贝格

名称中有逗号;这是否使创建创建 csv-fomate 的解析器变得困难?

任何想法如何在 Perl 中做到这一点......如果可能的话,那就太好了! 关于这个小问题的许多提示-除此之外,一切都很棒且引人入胜!

顺便说一句 - 如果你愿意 - 我可以添加代码。这里没问题。

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

【问题讨论】:

    标签: mysql perl extract separator lwp


    【解决方案1】:
    #!/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/&nbsp;/ /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";
        }
    }
    

    【讨论】:

    • 你好 tadmc - 非常感谢,看起来非常令人印象深刻。 martin@suse-linux:~/perl> perl perl_bayern_stack.pl 无法在 @INC 中找到 Text/CSV.pm(@INC 包含:/usr/lib/perl5/site_perl/5.12.1/i586-linux-thread-多 /usr/lib/perl5/site_perl/5.12.1 /usr/lib/perl5/vendor_perl/5.12.1/i586-linux-thread-multi /usr/lib/perl5/vendor_perl/5.12.1 /usr/lib/ perl5/5.12.1/i586-linux-thread-multi /usr/lib/perl5/5.12.1 .) 在 perl_bayern_stack.pl 第 6 行。开始失败 - 编译在 perl_bayern_stack.pl 第 6 行中止。martin@suse-linux :~/perl>
    • 嗨 tadmc - 我会再试一次!顺便说一句:在上面提到的网站上 - 我有 6150 个结果 - 我可以得到所有(!!)带有脚本的那些。我们是否需要某种蜘蛛逻辑来解决这个问题。上面提到的脚本(在我的帖子中)有一些方法可以解决所有问题 - 不幸的是,它不关心分隔符。你的这个做得非常好 - 但目前我无法让它在这里工作......我会看看怎么了...我今天晚些时候回来!问候和非常感谢零
    • 好吧,我知道我需要来自 cpan 的 text-csv 模块 - 我尝试将它加载到我的机器上! - 我稍后再回来! - 并报告我的所有发现
    • 添加了 perl 模块!现在太好了!剩下的一件事:结果德国元音不带车->我对特殊字符有疑问。这是否与 utf-8 编码或 iso 8859-1 -encoding 有关...因为它有损坏的字符 --- 请参阅下一条评论中的结果:
    • 查看一些结果:martin@suse-linux:~/perl> perl perl_bayern_stack.pl "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
    【解决方案2】:

    我推荐使用 HTML::Parser 模块,您可以调整它以提取表格单元格的值。请参阅文档: http://search.cpan.org/perldoc?HTML::Parser

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-24
      • 2017-08-29
      • 1970-01-01
      • 1970-01-01
      • 2017-05-28
      • 1970-01-01
      相关资源
      最近更新 更多