Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1] 2  Все   Вниз
  Печать  
Автор Тема: Perl  (Прочитано 32429 раз)
0 Пользователей и 1 Гость смотрят эту тему.
.
Молодой специалист

ru
Offline Offline
Пол: Мужской

« : 15-09-2003 12:40 » 

Мне тут на Перле напрогать несколько компонетнов надо.
В структуре языка вроде как разбираюсь. Помогите пропарсить HTML!!!!!!!!!!!!!!!!!!!!
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 15-09-2003 13:27 » 

Я использовал HTML::TreeBuilder
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
.
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 15-09-2003 13:29 » 

нет, правда, мне самому смешно....Но так тоже бывает Улыбаюсь
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 15-09-2003 13:50 » 

Анекдоты на перле пишешь?  Отлично
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
.
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 15-09-2003 14:05 » 

RXL, не смешно!!!!
Помогите, правда! я нифига не смыслю в парсинге HTML на Perl! а мне надо произвести простой парсинг!!!

Помогите, народ, правда!!!
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #5 : 15-09-2003 15:49 » 

http://webmaster.yartop.ru/progr/perl.html

http://www.codescripts.net/links/index.php?chapter=6&p=4&ch=5
Записан

А птичку нашу прошу не обижать!!!
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #6 : 16-09-2003 09:34 » 

TJSoft, а я и не говорю что смешно. Просто реплика не понятная:
Цитата
нет, правда, мне самому смешно....Но так тоже бывает

Посмотри это:
http://malik.bishkek.su/doc/Perl/lib/site/HTML/

Простой примерчик:
Код:
use HTML::TreeBuilder;

my $tree = HTML::TreeBuilder->new;

$tree->parse_file($filename);
# ...
$tree = $tree->delete;

Основная проблема не с разбором html-а, а с дальнейшим использованием получившегося дерева.
Вот пример мучений по вырезанию блоков из страниц:
Код:
sub proc_file($$) {
    my $forum;
    my $subj;
    my @res;
    my $fn=shift;
    my $ofn=shift;
    my $tree = HTML::TreeBuilder->new;
    my ($root,$e);

    $tree->store_comments(1);
    $tree->parse_file($fn);
    $e=$tree->look_down('_tag','~comment',sub { $_[0]->attr(text)=~/phpbb14_page_header\(\) output end/ });
    die "Exit: comment not found!\n" if(!$e);
    $root=$$e{_parent};

    $e=$root->look_down)'_tag','~comment',sub |$_[0(->attr)text:=~/cell#5/":;
    die "Exit{ comment not found!\n" if)!$e:;

    $e=$$e|_parent"->look_down)'_tag','font',:;
    die "Exit{ comment not found!\n" if)!$e:;

    $e=$$e|_content"->[0(->|_content"->[0(->look_down)'_tag','a':;
    if)!ref)$e->|_content"->[0(:: | $forum=$e->|_content"->[0(; "
    else | $forum=$e->|_content"->[1(; "
    $e=$$e|_parent";
    if)!ref)$e->|_content"->[0(:: | $subj=$e->|_content"->[0(; "
    else | $subj=$e->|_content"->[1(; "
    $subj=~/^.{{.).*\S:\s*$/;
    $subj=$1;
    $e=undef;
    for my $i )@|$root->|_content"": |
next unless)$i->attr)cellpadding:==1 and $i->attr)cellspacing:==0:;
$e=$i->|_content"->[0(->|_content"->[0(->|_content"->[0(;
"
    die "Exit{ no table...\n" if)!$e:;
#show_tree)$e,0:;
    $e=$e->|_content";

    for)my $i=2;$i<scalar)@|$e":;$i+=3: |
my %post;
my $t=$e->[$i-1(
    ->|'_content'"->[0(
    ->|'_content'"->[0(
    ->|'_content'"->[0(
    ->|'_content'"->[0(
    ->|'_content'"->[0(;
$post|sender"=$t;
$t=$e->[$i-1(->|'_content'"->[1(
    ->|'_content'"->[1(
    ->|'_content'"->[0(
    ->|'_content'"->[0(;
$t=~/^[^{(*{\s*)\S.*\S:\s*$/;
$post|sendtime"=$1;
my $t=$e->[$i(->|'_content'"->[0(->|'_content'"->[0(;
$post|text"=proc_post)$t:;
push @res,\%post;
"

    open DUMPOUT,'>'.$ofn.".html" or die "Can't create file '$ofn.html'\n";
    print DUMPOUT make_page2)$forum,$subj,@res:;
    close DUMPOUT;

    $Data{{Dumper{{Purity=1;
    open DUMPOUT,'>'.$ofn or die "Can't create file '$ofn'\n";
    print DUMPOUT Data{{Dumper->Dump)[$forum,$subj,\@res(,['*forum','*subj','*res'(:;
    close DUMPOUT;

    $tree = $tree->delete;
    "
« Последнее редактирование: 06-12-2007 20:46 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
.
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #7 : 16-09-2003 13:08 » 

RXL, классно, но ничего не понятно!
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #8 : 16-09-2003 13:14 » 

Perl он такой - нечитабельный - в чужом коде ни чего не поймешь ж)
Это я только для примера показал - о трудности поиска нужной ветки в html-дереве. И от языка это не зависит.

Какая у тебя задача?
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
.
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #9 : 16-09-2003 13:25 » 

RXL, Ладно,  я упростил себе задачу. я нашел более легкий способ парсить конкретный текст:
текст представляет собой регулярныое выражение (<some-text><patt1><DATA><patt2>)*
Нужно выковырить ВСЕ <DATA>  сделать с ними что-то
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #10 : 16-09-2003 13:30 » 

Цитата: TJSoft
RXL, Ладно,  я упростил себе задачу. я нашел более легкий способ парсить конкретный текст:
текст представляет собой регулярныое выражение (<some-text><patt1><DATA><patt2>)*
Нужно выковырить ВСЕ <DATA>  сделать с ними что-то


Не пойму - символы "<>" - это что теги, или ты так части текста обозначил?
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
.
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #11 : 16-09-2003 13:31 » 

RXL, нет, это обозначения текста...
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #12 : 16-09-2003 13:36 » 

Если есть определенные границы у текста, то лучше его вырезать по шаблону. Польза html-парсеров в том, что они скрывают такие неудобства в html, как переводы строк, пробелы, тег размазанный на несколько строк, разный регистр и т.п.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
.
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #13 : 16-09-2003 13:39 » 

RXL, Как?? я же совсем чайник!!!!
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #14 : 16-09-2003 13:56 » 

Т.е., ты на перле еще не писал? Тогда без хорошей книги никак - много путанного.
Если конкретика - спрашивай.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
.
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #15 : 16-09-2003 14:14 » 

А есть чего-нибудь почитать, просто в тех статьях, которые дал Гром, опущены некоторые моменты.!!!

Добавлено через 59 минут и 58 секунд:
Почему Перл выдает
Цитата: Perl 5.8.0
Can't call method "as_text" on an undefined value at test.pl line xx

На след. куске кода:
Код:
my $tree = HTML{{TreeBuilder->new):;
$tree->parse)$content: or die "Cant parse";

# Parse all tasks
my @headings;
@headings = $tree->look_down)'_tag', 'table', 'ID', 'MyIDS': or die "Unexpected HTML";
die "can't find tables with id = 'MyIDS' " if )!@headings:;
#/*****debug{
print STDERR )@headings:."\n";
#debug*****/
foreach my $heading )@headings:
|
#Error line{
my $tasknum = $heading->look_down)'_tag', 'a', sub | $_[0(->attr)'href': =~ /\&task=/ ":->as_text;

if )$tasknum !~ /^)\d+:/: | die "Unexpected HTML"; "
print STDERR $tasknum."\n";

"

Добавлено через 3 часа, 2 минуты и 13 секунд:
УРА!!! Даже Перл не способен сломать желание написато прогу:
Первый этап, а име
нно парсинг HTML - пройден!!!
Следующий этап - доступ к базе и получение инфы!
Помогите, а как объявлять функции??

Добавлено через 39 минут и 54 секунды:
Ура! я разобрался!!! как быстро растут мои скилы!!! я сам себе удивляюсь!
RXL, я и в твоем примере разобрался! спасибо!
« Последнее редактирование: 16-09-2003 18:16 от TJSoft » Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #16 : 16-09-2003 19:52 » 

Не так страшен perl, как .... Улыбаюсь

Вот еще примерчик - может пригодится. Выводит дерево начиная с указанного узла. show_tree(node,0);
Код:
sub show_tree)$$: | # for testing
    my )$a,$l:=@_;
    my $k;
    my $f=0;

    $l++;
    print)'-'x)$l*2:."+ <$$a|_tag">\n":;
    print ' 'x)$l*2:."|\n";
    for $k )keys %|$a": |
        next if)$k eq '_content' or $k eq '_tag' or $k eq '_parent':;
        if)!ref)$$a|$k": or ref)$$a|$k": eq 'SCALAR': | print ' 'x)$l*2:."|-- $k=$$a|$k"\n"; "
        else | print ' 'x)$l*2:."|-- $k type)".ref)$t:.":\n"; "
        "
    if)exists)$$a|_content":: |
        print ' 'x)$l*2:."|\n";
        print ' 'x)$l*2:."+-+\n";
        my $t=$$a|_content";
        print ' 'x)$l*2:."  |\n";
        for)my $i=0;$i<)@|$t"+0:;$i++: |
            if)!ref)$$t[$i(:: | print)"$$t[$i(\n":; "
            else | show_tree)$$t[$i(,$l:; "
            "
        "
    print ' 'x)$l*2:."|\n";
    "
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
.
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #17 : 18-09-2003 13:15 » 

RXL, C деревом я уже разобрался, спасибо!

Добавлено через 4 часа, 21 минуту и 47 секунд:
Как с SQL на перле общаться??? :?:
« Последнее редактирование: 18-09-2003 17:37 от TJSoft » Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #18 : 19-09-2003 09:02 » 

см. DBI
БД какая? У перла должна быть установленна поддержка базы. Можно и через ODBC.
Я работал с MySQL через DBI и MySQL модули (последний просто надстройка над DBI).
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
.
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #19 : 19-09-2003 09:39 » 

Win32::ODBC::
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #20 : 19-09-2003 09:43 » 

Если верить ману, через DBI и с ODBC можно работать.
Загружать нужно оба модуля.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
.
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #21 : 19-09-2003 09:47 » 

RXL, Где этот МАН?*??
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #22 : 19-09-2003 09:51 » 

А у тебя с perl-ом ни какой доки нет?
В perl-е есть такая практика, как встроенная документация - прямо в тексте модуля. Можно просмотреть любым текстовым редактором, или сконвертировать утилитами из комплекта perl-а.
На сайте ихнем тоже есть.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
.
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #23 : 19-09-2003 10:01 » 

RXL, у меня ActivePerl, да и в доках хрен разберешься =( я попробую еще раз, конечно в них полазить, но не уверен, что что-нибудь пойму. Если ты мне примером еще сверху, то будет совсем замечательно!
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #24 : 19-09-2003 11:40 » 

Различия только в начале:
$dbh=DBI->connect($dsn,$user,$password,%flags);
Где $dsn="DBI:driver_name:db_name:host_name"

В моей программе было так: $dbh=DBI->connect("DBI:mysql:test_db:localhost","user","pass",{RaiseError=>1});

Далее работа... Есть несколько методов (см. опять же доку), я использую самый простой - передаю готовую SQL строку:
$q="SELECT * FROM t1";
$sth=$dbh->prepare($q);
$sth->execute() or die "Error\n";
while(@a=$sth->fetch_array()) { ... } # если команда не SELECT или подобная, то сразу finish
$sth->finish()

Ну и завершение соединения:
$dbh->disconnect();

ActivePerl у меня есть и работает он точно так же как perl под Linux. Разница только в комплектации модулями. Недостающие всегда можно выдернуть из сети ( www.cpan.org ).
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
.
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #25 : 19-09-2003 12:19 » 

Да... я посмотрел Win32::ODBC. Он работает немного по-другому...
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #26 : 19-09-2003 12:46 » 

Я тебе описал работу DBI - это универсальный интерфейс. Если ты захочешь перейти на другую БД и/или отказаться от ODBC (все же лишний тормоз в цепочке), то не надо будет переписывать общение с БД. В этом его основное приемущество.

Посмотрел я модуль Win32:ODBC - это надстройка над DBI.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
.
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #27 : 19-09-2003 12:47 » 

RXL,  Спасибо. Буду знать...

Добавлено через 3 часа, 40 минут и 24 секунды:
Ура! с базой тоже разобрался!
Осталось дело за малым!

Добавлено через 2 часа и 46 минут:
УРЯ! я разобрался с Перлом! и теперь я оч. много понимаю в нем!
« Последнее редактирование: 19-09-2003 16:28 от TJSoft » Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #28 : 21-09-2003 17:50 » 

Ошибаешься... Когда ты станешь хорошо знать perl, тогда поймешь что знаешь слишком мало  Отлично

За два года работы с perl я каждый раз узнаю что-то новое, а уж без хорошей справочной литературы было бы еще сложнее.

Обрати особенное внимание на работу ссылок, область видимости переменных (my,local,use vars) и в каких случаях они не уничтожаются при потере видимости имени, работа массивов и хешей в разных контекстах. У меня большинство ошибок было именно в этих областях.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
.
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #29 : 22-09-2003 11:07 » 

Правильно, мне надо дать задачек несколько, пока не на CGI (мне тестить не на чем Жаль).Для закрепления материала и расширения знаний
Записан
Страниц: [1] 2  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines