Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Почему HTML не парсится ?


Автор: stan777 13.2.2007, 11:42
Короче не знаю как лучше парсить формы в веб документах
мне нужно чтобы обработчик бежал по стронице и выдавал, вот такой результат

script1.cgi?var1= &var2= &var3=

script2.cgi?var11= &var22= &var33=
не знаю что лучше использовать мнгомерные массивы или простой какойнибуди обработчик ??

Автор: stan777 13.2.2007, 13:11
Спасибо вроде так работает 
Код

my @a=([my @f],
       [my @g],
       [my @h]);

$a[1][1]=100;

print $a[1][1];

Автор: amg 13.2.2007, 13:23
stan777, совет: при работе со всякими структурами данных (в частности, с многомерными массивами), чтобы посмотреть, как выглядит твоя структура, очень удобно пользоваться модулем Data::Dupm (ну или стандартным Data::Dupmer)
Например, 
Код

use Data::Dump('dump');
@a=(["a","b","c"],["d","e"],["f"]);
dump @a;
$a[1][1]="ASD"; 
dump @a;

Код

(["a", "b", "c"], ["d", "e"], ["f"])
(["a", "b", "c"], ["d", "ASD"], ["f"])

Автор: stan777 13.2.2007, 13:38
Цитата(amg @ 13.2.2007,  13:23)
stan777, совет: при работе со всякими структурами данных (в частности, с многомерными массивами), чтобы посмотреть, как выглядит твоя структура, очень удобно пользоваться модулем Data::Dupm (ну или стандартным Data::Dupmer)
Например, 
Код

use Data::Dump('dump');
@a=(["a","b","c"],["d","e"],["f"]);
dump @a;
$a[1][1]="ASD"; 
dump @a;

Код

(["a", "b", "c"], ["d", "e"], ["f"])
(["a", "b", "c"], ["d", "ASD"], ["f"])

Короче не знаю как лучше парсить формы в веб документах
мне нужно чтобы обработчик бежал по стронице и выдавал, вот такой результат

script1.cgi?var1= &var2= &var3=

script2.cgi?var11= &var22= &var33=
не знаю что лучше использовать мнгомерные массивы или простой какой нибудь другой способ??
я имею вот такой код 

Код

my $str =getform($url);
my  @array= split(" ", $str);
chomp(@array);
my $patf1="<form";
my $patf2="</form";
my $hitr1="<!--";
my $hitr2="-->";

my @new_array;
    my $fflag=0;

       foreach my $i (@array){

    if($i =~/\Q$hitr1/){$fflag--;}
    if($i =~/\Q$hitr2/){$fflag++;}

    if ($i=~/\Q$patf1/i){$fflag=1;}

        if($fflag>0){push @new_array, $i;}

    if($i=~ /\Q$patf2/i){$fflag=0;}
        
    }

всё что лежит между <form  </form> я отправляю в массив @new_array только в документе много таких кусков, и мне нужно допустим каждый кусок записывать в отдельный массив, как это сделать ? 

Автор: Shaggie 13.2.2007, 13:45
stan777, перестань менять первый пост, это 1) против правил форума, могут забанить, 2) просто по-человечески неудобно читать, да и с темой не совпадает.

Одна тема - один вопрос!

И давай более развернутый вопрос, из последнего я например совершенно ничего не понял. Формы? Или ссылки? И при чем тут многомерные массивы?

Автор: stan777 13.2.2007, 13:48
мля я сам уже не понял, запутался блин  smile 

Автор: Shaggie 13.2.2007, 13:50
Цитата(stan777 @  13.2.2007,  13:38 Найти цитируемый пост)
всё что лежит между <form  </form> я отправляю в массив @new_array

А теперь обрабатывай что получил! Параметры передаются в тегах <input>, их имена - в параметре "name". Регулярку сам напишешь?

Автор: stan777 13.2.2007, 13:59
конечно попробую сам, если впросы еще будут спрошу ок smile

Автор: stan777 13.2.2007, 15:58
вот у меня такой код для пробега внутри поля <input ...............  >

Код

my $iflag=0;

    foreach my $ne (@form_array){# так я получаю все внутри тега input
                    if ($ne=~/\Q$intp1/i){$iflag=1;}  # вот тут ошибка 1 !
        if($iflag>0){push @input_array, $ne;}
        if($ne=~ /\>/){$iflag=0; # вот тут ошибка 2 !
                foreach my $ie (@input_array){
                        print $ie."\n";
                            }
                            @input_array=();
                        }

Теперь код такой, но это несколько не то что яхотел мне нужно чтобы он  внутри поля <input ...............  >

Код

my $iflag=0;

        foreach my $ne (@form_array){
        
                print $ne."\n" if $ne=~/\Q$patf1/ || $ne=~/\Q$patf2)/;

                                if ($ne=~/\Q$intp1/i){$iflag=1;
                            $ne=$';
                                }

                if($iflag>0){push @input_array, $ne;}

                if($ne=~ /\>$/){$iflag=0;
                    
                            foreach my $ie (@input_array){
                                print $ie."\n";
                        # if $ie =~/name\=\"/;
                            }
                            @input_array=();
                        }

                
        }
        @form_array=();


как сказать сказать чтобы скрипт брал в переменную только что стоит после /\Q$intp1/ и все что стоит перед /\>/ ?

Добавлено @ 16:03 

Автор: Shaggie 13.2.2007, 17:14
stan777, сначала скажи прямо, что ты хочешь получить.

Я так понимаю, тебя интересуют имена всех переменных, которые могут посылаться из форм. При попытке проанализировать встретились закоментированные участки кода. Теперь все силы уходят на то, чтобы отделить комментарии от выполняемого текста программы... Правильно?

Автор: stan777 13.2.2007, 19:00
да правильно, мне тут сказали писать эту ерунду через  $p = HTML::TokeParser
что я конечно получаю с помощью нее но не точто нужно.

    
Код

    my $cpanurl = 'http://search.cpan.org/recent';
   my $rawHTML = get($cpanurl); # attempt to d/l the page to mem
   
   die "LWP::Simple messed up $!" unless ($rawHTML);
                                # Habit.  if it's empty, TokeParser would notice
   
   my $p = HTML::TokeParser->new(\$rawHTML) || die "Can't open: $!";
   
   while (my $token = $p->get_token)
   {
       my $ttype = shift @{ $token };
   
       if($ttype eq "S")    # start tag?
       {
           my($tag, $attr, $attrseq, $rawtxt) = @{ $token };
   
           if($tag eq "form")
           {
               my $form_action = $attr->{'action'};
               print $form_action."\n";
           }
    }
    }
 
экшен получаю уже хорошо, а мне нужно получить еще и name в <input name="asd" >
не пойму как внутри каждого <form> .... </form> идти по импутам как заставить smile ?
есть спецы по TokeParser вот я слышал что Нитр про это говорил может знает smile?
Просто этот пример не прасит <input> внутри <form> .... </form> почему не знаю.

я вставляю внутрь 
Код

if($tag eq "form")
           {
               my $form_action = $attr->{'action'};
               print $form_action."\n";
               
              if($tag eq "input"){
                               my $name_action = $attr->{'name'};
                               print $name_action."\n";
                   } 
           } 
так вот не работает ! мож кто знает как заставить работать внутри  <form> .... </form>  ?

Автор: stan777 14.2.2007, 00:41
Спасибо для разбора полетов очень удобно пользоватся 
Код

#print $_."\n" foreach(@{ $token });

Автор: Nab 14.2.2007, 01:04
а удобней

print join "\n", @$token; 

smile

или в одну строку

print "@{$token}";

Автор: stan777 14.2.2007, 10:15
Цитата(Nab @ 14.2.2007,  01:04)
а удобней

print join "\n", @$token; 

smile

или в одну строку

print "@{$token}";

Да новерное меньше байтов приводится вводить smile.

А как быть с тем что у тегов <input> нет закрывающегося тега, поэтому он не имеет флага "E" в HTML : : TokeParser, как быть с ним ?
стати с помощью этого print join "\n", @$token;  я узнал что  <input> имеет "S" соответсвенно smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)