LINUX.ORG.RU

Интересный затык с регулярными вырожениями на perl


0

0

Как вы поймете из кода пытаюсь разобрать веб страницу!
Вот код:

# \$Data \@Info $BuySell
sub www($ $ $)
{
 my $CONST_NUMBER_OF_KEYS = 15;
 my $CONST_NUMBER_OF_FIELDS = 6;

 my $Return = 0;
 my $i = 0;
 while(${$_[0]} =~ m/<td width="32" nowrap id="Header">::/igc){
  $_[1]->[$i]->{IndType} = $_[2];
  ${$_[0]} =~ m/<b>/igc;
  ${$_[0]} =~ m/<b>(.*)<\/b><\/td>/igc;
  $_[1]->[$i]->{Name} = $1;
  ${$_[0]} =~ m/<A href="mailto:(.*)" class/igc;
  $_[1]->[$i]->{EMail} = $1;
  ${$_[0]} =~ m/<\/A>&nbsp;&nbsp;(.*)<\/td>/igc;
  if(length($1) < 7){
   $_[1]->[$i]->{Phone} = "";
  }
  else{
   $_[1]->[$i]->{Phone} = $1;
  }
  ${$_[0]} =~ m/<td id="Header" align="right">(.*)<\/td>/igc;
  $_[1]->[$i]->{PostDate} = $1;
  ${$_[0]} =~ m/style="padding-left=10 px;">/igc;
  ${$_[0]} =~ m/(.*)<\/td>/igc;
  $_[1]->[$i]->{Other} = $1;
  if(scalar(keys %{$_[1]->[$i]}) != $CONST_NUMBER_OF_FIELDS){
   $Return = 1;
   last;
  }
  $i++;
 }
 if($CONST_NUMBER_OF_KEYS != $i){
  $Return = 2;
 }
 return $Return;
}

★★★

>

Объясняю в чем дело и трабл: На странице находиться 15 повторяющихся блоков (она засунута в переменную $Data), я их пытаюсь разобрать и засунуть в массив хешей (@Info). Прикол в том, что Name, EMail,Phone и т.д. разбираются вполне хорошо ВО ВСЕХ 15 блоках, а вот в Other ну никак не хочет залезать то что нужно! :( Причем в процессе исследования становиться ясно что колбасит именно регулярные выражения а не /dev/hands, хотя и это не исключено! ;)

Плиз, кто хорошо разбирается в регулярных ворожениях помогите!

Mrak ★★★
() автор топика
Ответ на: комментарий от vilfred

Вот пример ХТМЛ (2 элемента из 15)

<!-- ITEMS -->
<table width="100%" cellspacing="0" cellpadding="0" border="0">
<tr>
    <td width="32" nowrap id="Header">::
    <td id="Header"><B>

<B>Виталий Анатольевич</B></td>
    <td id="Header">&nbsp;&nbsp; email:<A href="mailto:anatolich@mail.ru"; class="my1" style="color: #ffffff;">anatolich@mail.ru</A>&nbsp;&nbsp;095 7264432</td>
    <td id="Header" align="right">2004-11-05 10:11:01</td>
    <td width="32" id="Header" nowrap id="Header0">
   <A href="/print/8/1024285"><img src="/images/print.gif" width=19 height=20 border=0 alt="Версия для печати"></A>
   </td>
</tr>
</table>
<table width="100%" cellspacing="0" cellpadding="0" border="0">
   <tr>
       <td align="left" id="Header2" style="padding-left=10 px;">
   Поховская ул., д.25.


      </td>
   </tr>
</table>
<br>
<!-- ITEMS -->

<br>



<!-- ITEMS -->
<table width="100%" cellspacing="0" cellpadding="0" border="0">
<tr>
    <td width="32" nowrap id="Header">::
    <td id="Header"><B>

<B>Андрей</B></td>
    <td id="Header">&nbsp;&nbsp; email:<A href="mailto:5026400@mail.ru"; class="my1" style="color: #ffffff;">5026478@mail.ru</A>&nbsp;&nbsp;095 5026400</td>
    <td id="Header" align="right">2004-11-05 09:48:44</td>
    <td width="32" id="Header" nowrap id="Header0">
   <A href="/print/8/1024272"><img src="/images/print.gif" width=19 height=20 border=0 alt="Версия для печати"></A>
   </td>
</tr>
</table>
<table width="100%" cellspacing="0" cellpadding="0" border="0">
   <tr>
       <td align="left" id="Header2" style="padding-left=10 px;">
Проспект мира, д. 115.

   5026400
      </td>
   </tr>
</table>
<br>
<!-- ITEMS -->

+ в ф-ии www надо закоментить if($CONST_NUMBER_OF_KEYS != $i)

И вот загрузка этого дела:

open(FILE,"sail.html") or die "!!!!";
undef($/);
$Data = <FILE>;
$/ = "\n";
close(FILE);


$Ret = www(\$Data,\@Info,0);
if($Ret != 0){
 print "Error $Ret !!!\n";
 exit;
}

$l = 0;
foreach $i (@Info){
 foreach $j (keys %{$i}){
  print "$j = $i->{$j}\n";
 }
 print "-------------\n\n";
 $l++;
}
print "ALL: $l\n";

Mrak ★★★
() автор топика
Ответ на: комментарий от Mrak

Привет, вот тебе простенький парсер твоего файла. 

#!/usr/bin/perl

open(FILE,"sail.html") or die "!!!!";
    undef($/);
    $data = <FILE>;
    $/ = "\n";
close(FILE);

$data =~ s/\n//g;
$data =~ s/>\s+/>/g;
$data =~ s/\s+</</g;
$data =~ s/<.*?ITEMS.*?>.*?<.*?ITEMS.*?>/print_item($&)/gie;

sub print_item
{
   my $html = $_[0];
   my (@item, $i);
      
   $html =~ s/>(.*?)</push @item,$1 if $1/ge;
   @item = map {$i=0 if $i > 6; s/&nbsp;\s?//gi; $i++ . " " . $_} @item;

   print join ("\n", @item) . "\n";
}

anonymous
()
Ответ на: комментарий от Mrak

Вот что получается в результате:

0 ::
1 Виталий Анатольевич
2 email:
3 anatolich@mail.ru
4 095 7264432
5 2004-11-05 10:11:01
6 Поховская ул., д.25.
0 ::
1 Андрей
2 email:
3 5026478@mail.ru
4 095 5026400
5 2004-11-05 09:48:44
6 Проспект мира, д. 115.   5026400

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.