2013-02-25 2 views
0

Я создал один скрипт, который будет извлекать все данные Row из тегов HTML <TR>. У меня есть 30 тегов HTML <TR> на моей странице HTML. Основываясь на подсчете, мой код будет извлекать данные определенной строки. Предположим, если мне нужны данные, присутствующие в 5 <tr>...</tr>, то мое состояние if(count =5) {(go inside and get that data)}Извлеките несколько строк с помощью HTML :: TableExtract

Но моя проблема здесь. Мне нужны данные по выбранным строкам по одному. Предположим, мне нужны данные для строк 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; 
     }  
    } 
} 
+0

Благодаря отступы ваш код правильно. –

ответ

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; 
    } 
} 
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";  
}