0

我制作了一个脚本,它将从 HTML<TR>标记中提取所有 Row 数据。<TR>我的 HTML 页面上有 30 个 HTML标签。根据计数,我的代码将获取特定的行数据。假设我需要 5th 中的数据<tr>...</tr>,那么我的条件是if(count =5) {(go inside and get that data)}

但我的问题是我一次需要一个选定行的数据。假设我需要第 5、6 和 14 行的数据。

你能帮我整理一下吗?

$te = new HTML::TableExtract(count => 0 );
$te->parse($content);
# Examine all matching tables
foreach $ts ($te->table_states) {
    #print "Table (", join(',', $ts->coords), "):\n";
    $cnt = 1;
    foreach $row($ts->rows) {
        # print " ---- Printing Row $cnt ----\n";
        $PrintLine= join("\t", @$row);
        @RowData=split(/\t/,$PrintLine);
        $PrintLine =~ s/\r//ig;
        $PrintLine =~ s/\t//ig;
        $cnt = $cnt + 1;
        #   if ($PrintLine =~ /Site ID/ig || $PrintLine =~ /Site name/ig){print " Intrest $PrintLine $cnt =====================\n"};
        if ( $cnt == 14) { 
            $arraycnt = 1;
            my $SiteID="";
            my $SiteName="";
            foreach (@RowData) {
                # print " Array element $arraycnt\n";
                chomp;
                $_ =~ s/\r//ig;
                $_ =~ s/[\xC3\xA1\xC3\xA0\xC3\xA2\xC3\xA3]//ig;
                if ($arraycnt== 17 ) { $SiteID= $_;}
                if ($arraycnt== 39 ) { $SiteName= $_;}
                    $arraycnt = $arraycnt + 1;
            } 
            #$PrintLineFinal = $BridgeCase."\t".$PrintLine;
            $PrintLineFinal = $BridgeCase."\t".$SiteID."\t".$SiteName;
            #print "$PrintLineFinal\n";
            print MYFILE2 "$PrintLineFinal\n";          
            last;
        }       
    }
}
4

2 回答 2

0

您可以像这样访问结果:

foreach $ts ($te->table_states) {
    #you need 14th rows
    #my 14throws = $ts->rows->[13];#starting with zero!
    #17th col from the 14th row
    #my $17colfrom14throws = $ts->rows->[13]->[16];
    my $SiteName = $ts->rows->[13]->[38];
    my $SiteID   = $ts->rows->[13]->[16];
    my $PrintLineFinal = $BridgeCase."\t".$SiteID."\t".$SiteName;
    print MYFILE2 "$PrintLineFinal\n";     
}
于 2013-02-26T09:46:32.290 回答
0

几点建议:

总是:

 use strict;
 use warnings;

这将迫使您使用my. 例如

foreach my $ts ($te->table_states) {
   my $cnt = 1;

warnings会让你知道最愚蠢的错误。strict通过要求你在某些情况下使用更好的做法来防止错误)。

在几个地方,您在遍历数组时使用自己的计数器变量。你不需要这样做。相反,只需直接获取您想要的数组元素。例如$array[3]获取第三个元素。

Perl 还允许数组切片获取您想要的某些元素。@array[4,5,13]获取数组的第五个、第六个和第十四个元素。您可以使用它来仅处理您想要的行,而不是遍历所有行:

my @rows = $ts->rows;
foreach my $row (@rows[4,5,13]) #process only the 5th, 6th, and 14th rows.
{
    ...
}

这是同一事物的快捷版本,使用匿名数组:

foreach my $row (@{[$ts->rows]}[4,5,13])

此外,也许您想在代码的其他地方定义您想要的行:

my @wanted_rows = (4,5,13);
...
foreach my $row (@{[$ts->rows]}[@wanted_rows])

这段代码很混乱:

$PrintLine= join("\t", @$row);
@RowData=split(/\t/,$PrintLine);
$PrintLine =~ s/\r//ig;
$PrintLine =~ s/\t//ig;

首先,您要加入一个带有制表符的数组,然后您要拆分刚刚加入的数组以再次获取该数组。然后,您无论如何都要从该行中删除所有制表符。

我建议你摆脱所有这些代码。只需@$row在需要数组时使用,而不是复制它。如果您需要打印数组以进行调试(这就是您似乎正在做的所有事情$PrintLine,您可以直接打印一个数组:

print @$row;    #print an array, nothing between each element.
print "@$row";  #print an array with spaces between each element.

通过所有这些更改,您的代码将如下所示:

use strict;
use warnings;

my @wanted_rows = (4,5,13);

my $te = new HTML::TableExtract(count => 0);

$te->parse($content);
# Examine all matching tables
foreach my $ts ($te->table_states) {
    foreach my $row (@{[$ts->rows]}[@wanted_rows]) {

        s/[\xC3\xA1\xC3\xA0\xC3\xA2\xC3\xA3\r\n]//ig for (@$row);

        my $SiteID   = $$row[16] // '';  #set to empty strings if not defined.
        my $SiteName = $$row[38] // '';  
        print MYFILE2 $BridgeCase."\t".$SiteID."\t".$SiteName;
    }
}
于 2013-02-26T09:40:39.893 回答