Newsgroup: it.comp.lang.perl
Titolo: parsing html con RE

Salve,
         ho un problema nel parsare un file html infatti alla sorgente hanno 
cambiato il file e messo tutto su una riga, quindi ora dovr� cambiare per 
forza il parser ovvero la RegExp:
prima la reg era cos�:
foreach (@lines)
{
  chomp();
  if 
(m/<td.+?<a.+?>(.+?)<\/a.+?b>(.+?)<\/b.+?font.+?>(.+?)<\/font>(.+?)<\/td>/i)
  { $1 $2 $3 etc...}
}
ora per� la parte che voglio parsare si trova tutta su una riga, il sorgente 
hatml della tabella lo trovate qu�: 
http://theartofweb.net/tabella.html
questo � un esempio della riga in questione:
<tr ALIGN="right" bgcolor=#E5E5E5><td  ALIGN="left" nowrap><a 
href=?modo=grafico&type=indice&tlv=ITLMS&service=rtlite&lang=it&t=&sid=7a78eef1rg4n5cpoqonmak5dm6>FTSE 
Italia All-Share</a></td><td><b>22.337,8300</b></td><td nowrap><font 
color="#00AA00">  +1,58%</font></td><td 
ALIGN="center">13:51:00</td><td>0,0000</td><td>0.0</td><td>0,0000</td><td>0.0</td><td>0.0</td></tr><tr 
ALIGN="right" bgcolor=#ffffff><td  ALIGN="left" nowrap><a 
href=?modo=scheda&tlv=IT0009417178&service=rtlite&lang=it&t=&sid=7a78eef1rg4n5cpoqonmak5dm6>FIBSP</a></td><td><b>21.910,0000</b></td><td 
nowrap><font color="#00AA00">  +1,67%</font></td><td 
ALIGN="center">13:51:05</td><td>21.910,0000</td><td>6</td><td>21.920,0000</td><td>6</td><td>0.0</td></tr>...etc...
ed io dovrei prendere:
<tr ALIGN="right" bgcolor=#E5E5E5><td  ALIGN="left" nowrap><a 
href=?modo=grafico&type=indice&tlv=ITLMS&service=rtlite&lang=it&t=&sid=7a78eef1rg4n5cpoqonmak5dm6>FTSE 
Italia All-Share</a></td><td><b>22.337,8300</b></td><td nowrap><font 
color="#00AA00">  +1,58%</font></td><td 
ALIGN="center">13:51:00</td><td>0,0000</td><td>0.0</td><td>0,0000</td><td>0.0</td><td>0.0</td></tr>
con i relativi valori: FTSE Italia All-Share * 22.337,8300 * +1,58% * 
13:51:00 * etc... cosa che prima riuscivo a fare benissimo...
come devo modificare la RE??
grazie

 prima la reg era cos�:
ecco la sub che si occupava di fare la RE:
sub _create_file
{
    my $html  = shift;
    my @lines = split "\n", $$html;
    my $tnew  = time;
    my @quote;
    my $null  = 'N/A';
    my $xml = qq|<refresh lup="$tnew" time="5" tes="0">| . "\n";
    my $suff  = 'ftsemib';
    my $sub = 'ALIGN="center">';
    foreach (@lines)
    {
 chomp();
        if 
(m/<td.+?<a.+?>(.+?)<\/a.+?b>(.+?)<\/b.+?font.+?>(.+?)<\/font>(.+?)<\/td>/i)
        {
            my @array = split /\s+/, &_strip($4);
            $quote[0] = &_strip($1); next if $quote[0] eq 'FTSE Italia 
All-Share';
            $quote[1] = &_strip($2);
            $quote[2] = &_strip($3);
            $quote[3] = $array[0];
            $quote[4] = $array[1];
            $quote[5] = $array[2];
            $quote[6] = $array[3];
            $quote[7] = $array[4];
     $quote[4] =~ s/$sub//i;
     $quote[4] = &_normalize_time($quote[4]);
            $xml .= qq|<item cpn="$quote[0]" lpr="$quote[1]" ltt="$quote[4]" 
pch="$quote[2]" />| . "\n";
        }
    }
    return $xml;
}
sub _strip
{
    my $line = shift;
    $line =~ s/[^ -~]+//g;
    $line =~ s/^\s+//;
    $line =~ s/\s+$//;
    return $line;
}
sub _normalize_time
{
    return;
} 

Con questo codice riesco ad accedere subito alla tabella nel file:
open my $fh1, "<", "tabellone.html";
local $/ = undef;
my $file = <$fh1>;
close $fh1;
my $table; ($table) = ($file =~ /<table.+?>(.*?)<\/table>/sg);
Quindi in $table ho la tabella html.
Se faccio:
my $tr; ($tr) = ($table =~ /<tr ALIGN="right".+?>(.*?)<\/tr>/sg);
riesco addirittura ad accedere alla prima riga! ma poi come accedo alle 
altre sequenzialmente?
se riuscissi a fare uno split! in un hash di tutto quello che �: $table =~ 
/<tr ALIGN="right".+?>(.*?)<\/tr>/

 altre sequenzialmente?
my @tr;
$table =~ s/<tr ALIGN="right".+?>(.*?)<\/tr>/(push @tr, $1)/sgoe;
Cosi'?
(attenzione che a volte 
newsland.it
 mi elimina dei caratteri essenziali...)
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 forza il parser ovvero la RegExp:
Mi cito addosso:
<
http://groups.google.com/group/it.comp.lang.perl/msg/b16bc43ab8c8a7fe?d
mode=source>
s.
-- 
Stefano Rodighiero      |  
http://www.stefanorodighiero.net
mailto:
lar...@perl.it
   |  Italian Perl Mongers: 
http://www.perl.it

 essenziali...)
si! incredibile! io avevo risolto con molto meno stile:
my $table; ($table) = ($html =~ /<table.+?>(.*?)<\/table>/sg);
my @values = split(/<tr ALIGN="right".+?>(.*?)<\/tr>/s, $table);