.
Молодой специалист
Offline
Пол:
|
|
« : 15-09-2003 12:40 » |
|
Мне тут на Перле напрогать несколько компонетнов надо. В структуре языка вроде как разбираюсь. Помогите пропарсить HTML!!!!!!!!!!!!!!!!!!!!
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #1 : 15-09-2003 13:27 » |
|
Я использовал HTML::TreeBuilder
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
.
Молодой специалист
Offline
Пол:
|
|
« Ответ #2 : 15-09-2003 13:29 » |
|
нет, правда, мне самому смешно....Но так тоже бывает
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #3 : 15-09-2003 13:50 » |
|
Анекдоты на перле пишешь?
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
.
Молодой специалист
Offline
Пол:
|
|
« Ответ #4 : 15-09-2003 14:05 » |
|
RXL, не смешно!!!! Помогите, правда! я нифига не смыслю в парсинге HTML на Perl! а мне надо произвести простой парсинг!!!
Помогите, народ, правда!!!
|
|
|
Записан
|
|
|
|
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии
Offline
Пол:
Бодрый птах
|
|
« Ответ #5 : 15-09-2003 15:49 » |
|
|
|
|
Записан
|
А птичку нашу прошу не обижать!!!
|
|
|
RXL
|
|
« Ответ #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 »
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
.
Молодой специалист
Offline
Пол:
|
|
« Ответ #7 : 16-09-2003 13:08 » |
|
RXL, классно, но ничего не понятно!
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #8 : 16-09-2003 13:14 » |
|
Perl он такой - нечитабельный - в чужом коде ни чего не поймешь ж) Это я только для примера показал - о трудности поиска нужной ветки в html-дереве. И от языка это не зависит.
Какая у тебя задача?
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
.
Молодой специалист
Offline
Пол:
|
|
« Ответ #9 : 16-09-2003 13:25 » |
|
RXL, Ладно, я упростил себе задачу. я нашел более легкий способ парсить конкретный текст: текст представляет собой регулярныое выражение (<some-text><patt1><DATA><patt2>)* Нужно выковырить ВСЕ <DATA> сделать с ними что-то
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #10 : 16-09-2003 13:30 » |
|
RXL, Ладно, я упростил себе задачу. я нашел более легкий способ парсить конкретный текст: текст представляет собой регулярныое выражение (<some-text><patt1><DATA><patt2>)* Нужно выковырить ВСЕ <DATA> сделать с ними что-то Не пойму - символы "<>" - это что теги, или ты так части текста обозначил?
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
.
Молодой специалист
Offline
Пол:
|
|
« Ответ #11 : 16-09-2003 13:31 » |
|
RXL, нет, это обозначения текста...
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #12 : 16-09-2003 13:36 » |
|
Если есть определенные границы у текста, то лучше его вырезать по шаблону. Польза html-парсеров в том, что они скрывают такие неудобства в html, как переводы строк, пробелы, тег размазанный на несколько строк, разный регистр и т.п.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
.
Молодой специалист
Offline
Пол:
|
|
« Ответ #13 : 16-09-2003 13:39 » |
|
RXL, Как?? я же совсем чайник!!!!
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #14 : 16-09-2003 13:56 » |
|
Т.е., ты на перле еще не писал? Тогда без хорошей книги никак - много путанного. Если конкретика - спрашивай.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
.
Молодой специалист
Offline
Пол:
|
|
« Ответ #15 : 16-09-2003 14:14 » |
|
А есть чего-нибудь почитать, просто в тех статьях, которые дал Гром, опущены некоторые моменты.!!! Добавлено через 59 минут и 58 секунд:Почему Перл выдает 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
|
|
« Ответ #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"; "
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
.
Молодой специалист
Offline
Пол:
|
|
« Ответ #17 : 18-09-2003 13:15 » |
|
RXL, C деревом я уже разобрался, спасибо!
Добавлено через 4 часа, 21 минуту и 47 секунд: Как с SQL на перле общаться??? :?:
|
|
« Последнее редактирование: 18-09-2003 17:37 от TJSoft »
|
Записан
|
|
|
|
RXL
|
|
« Ответ #18 : 19-09-2003 09:02 » |
|
см. DBI БД какая? У перла должна быть установленна поддержка базы. Можно и через ODBC. Я работал с MySQL через DBI и MySQL модули (последний просто надстройка над DBI).
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
.
Молодой специалист
Offline
Пол:
|
|
« Ответ #19 : 19-09-2003 09:39 » |
|
Win32::ODBC::
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #20 : 19-09-2003 09:43 » |
|
Если верить ману, через DBI и с ODBC можно работать. Загружать нужно оба модуля.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
.
Молодой специалист
Offline
Пол:
|
|
« Ответ #21 : 19-09-2003 09:47 » |
|
RXL, Где этот МАН?*??
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #22 : 19-09-2003 09:51 » |
|
А у тебя с perl-ом ни какой доки нет? В perl-е есть такая практика, как встроенная документация - прямо в тексте модуля. Можно просмотреть любым текстовым редактором, или сконвертировать утилитами из комплекта perl-а. На сайте ихнем тоже есть.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
.
Молодой специалист
Offline
Пол:
|
|
« Ответ #23 : 19-09-2003 10:01 » |
|
RXL, у меня ActivePerl, да и в доках хрен разберешься =( я попробую еще раз, конечно в них полазить, но не уверен, что что-нибудь пойму. Если ты мне примером еще сверху, то будет совсем замечательно!
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #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 ).
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
.
Молодой специалист
Offline
Пол:
|
|
« Ответ #25 : 19-09-2003 12:19 » |
|
Да... я посмотрел Win32::ODBC. Он работает немного по-другому...
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #26 : 19-09-2003 12:46 » |
|
Я тебе описал работу DBI - это универсальный интерфейс. Если ты захочешь перейти на другую БД и/или отказаться от ODBC (все же лишний тормоз в цепочке), то не надо будет переписывать общение с БД. В этом его основное приемущество.
Посмотрел я модуль Win32:ODBC - это надстройка над DBI.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
.
Молодой специалист
Offline
Пол:
|
|
« Ответ #27 : 19-09-2003 12:47 » |
|
RXL, Спасибо. Буду знать...
Добавлено через 3 часа, 40 минут и 24 секунды: Ура! с базой тоже разобрался! Осталось дело за малым!
Добавлено через 2 часа и 46 минут: УРЯ! я разобрался с Перлом! и теперь я оч. много понимаю в нем!
|
|
« Последнее редактирование: 19-09-2003 16:28 от TJSoft »
|
Записан
|
|
|
|
RXL
|
|
« Ответ #28 : 21-09-2003 17:50 » |
|
Ошибаешься... Когда ты станешь хорошо знать perl, тогда поймешь что знаешь слишком мало За два года работы с perl я каждый раз узнаю что-то новое, а уж без хорошей справочной литературы было бы еще сложнее. Обрати особенное внимание на работу ссылок, область видимости переменных (my,local,use vars) и в каких случаях они не уничтожаются при потере видимости имени, работа массивов и хешей в разных контекстах. У меня большинство ошибок было именно в этих областях.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
.
Молодой специалист
Offline
Пол:
|
|
« Ответ #29 : 22-09-2003 11:07 » |
|
Правильно, мне надо дать задачек несколько, пока не на CGI (мне тестить не на чем ).Для закрепления материала и расширения знаний
|
|
|
Записан
|
|
|
|
|