Яндекс цитирования
 

CGI/PERL : практика программирования

 

[ В начало раздела ]

Автоматизация WEB: часть 2

В этой части открытого мною цикла статей на тему автоматизации WEB средствами Perl мы рассмотрим некоторые практические примеры использования силы пакета LWP. Тем, кому интересно, о чем мы говорили ранее, рекомендую прочесть первую часть цикла.

Парсинг WEB-документов

Итак, ранее мы рассмотрели, как вообще возможно получать WEB-документы по любому URL. Теперь рассмотрим, каким образом можно эти документы обрабатывать, выделяя из них необходимую нам информацию.

Например, как получить название документа, заключенного в тэгах <title>.

Допустим, что на вход нашего скрипта передается URL документа, а в ответ мы должны предоставить название этого документа. Пример работы представлен на рисунке 1.

Результат обработки URL с помощью скрипта

1. Результат обработки URL с помощью скрипта

Основой функии разбора является еще не используемый нами модуль HTML::HeadParser. В его задачу входит разбор параметров в секции HEAD HTML-документа. Например, чтобы получить любой из мета-тегов (http-equiv name=XXX), вы создаете объект HTML::HeadParser, задаете инструкцию на разбор любого URL, файла или строки, и получаете нужное Вам значение инструкцией:

 $p->header('Foo')

Что может получиться в итоге получиться, смотрите в примере ниже (полный листинг).

#!/usr/bin/perl

$myurl = $ENV{'QUERY_STRING'}; # $ARGV[0]; $title = get_url_title($myurl);

print "Content-type: text/html\n\n"; print "URL: $myurl<br>\n"; print "Title: $mytitle<br>\n";

exit (0);

sub get_url_title { use LWP::Simple; use HTML::HeadParser;

local ($url) = @_; $doc = get $url;

$p = HTML::HeadParser->new; $p->parse($doc);

$mytitle = $p->header('Title'); return ($mytitle); }

Пример работы скрипта можете посмотреть здесь: http://dolgov.hut.ru/cgi-bin/geturl.pl?http://dolgov.hut.ru.

Обработка HTML своими силами

Конечно, Вы можете и сами обрабатывать любой HTML-файл как обычную строку. Для этого активно используются регулярные выражения. Кое-что подробнее о регулярных выражениях, в частности приемы для обработки HTML, найдете здесь: http://www.xpoint.ru/archive/topic36/index.html

Здесь я приведу лишь несколько примеров обработки HTML, которыми пользуюсь сам.

1. Удаление всех HTML-тегов. В результате остается только текст.

$text =~ s/<[^>]*>//g;

2. Получение содержимого, заключенного в тегах. Например, название документа в тегах TITLE.

$text =~ /<TITLE>([^<]+)<\/TITLE>/i;

3. Обработка и выделение базы и документа для URL.

    if ($url =~ m/^([^#]*#)(.+)$/)
    {
      my ($base, $frag) = ($1, $2);
      $frag =~ s/ /%20/g;
      $url = $base . $frag;
    }

Шаг вперед – использование пользовательского агента

Теперь двинемся дальше. Использование пользовательских объектов очень полезное и удобное средство. За создание агента и его управление отвечает модуль LWP::UserAgent.

Агент работает совместно с объектами HTTP::Request и HTTP::Response.

Ниже представлен пример работы программы, извлекающей из HTML-документа все ссылки на другие документы и изображения. На рисунке 2 отображен результат работы этого скрипта.

Пример извлечения ссылок из HTML-документов

2. Пример извлечения ссылок из HTML-документов

Ядром скрипта является функциональность модуля HTML::LinkExtor, который специализируется на извлечении ссылок из документа. Ссылки он хранит как хэш-таблицу, где ключом является тег (img, a), а значения – хэш из ссылок.

Вот полный пример. Тщательно проанализируйте его. Если будут затруднения, обращайтесь к подсказке к модулям LWP, HTTP::UserAgent, HTML::LinkExtor.

#!/usr/bin/perl
####################################################################
# LinkExtrator Example v.1                                         #
# Программа выводит рассортированный список уникальных ссылок и    #
# изображений, содержащихся в URL, переданных в виде аргументов    #
# командной строки                                                 #
#                                                                  #
# Copyright 1994-2001 Сергей Долгов                                #
####################################################################
use strict;
use LWP;
use URI::URL;
use HTML::LinkExtor;

print "Content-type: text/html\n\n";

my ($url, $ua, %saw);

# создаю новый броузер $ua = LWP::UserAgent -> new(); $ua->agent('Mozilla/5.0');

# обрабатываю каждый URL из командной строки $url = $ENV{'QUERY_STRING'};

print "URL : $url<br>\n"; # печатаю URL

# формирую HTTP запрос my $req = HTTP::Request->new(GET => $url);

# подготавливаюсь к HTTP ответу my $res = $ua->request($req);

# если успешное получение ответа ... if ($res->is_success) { my $doc = $res->content; # ... создаю объект документа my $ct = $res->content_type; # ... тип содержимого print "Content-type = $ct<br>\n"; # обрабатываю только HTML файлы if ($ct eq "text/html") { my $base = $res->base; # базовый URL print "Base url: $base<br>\n"; # вытаскиваю все ссылки на объекты <A> и <IMG> foreach (HTML::LinkExtor->new->parse($doc)->eof->links) { my ($tag, %links) = @$_; next unless ($tag eq "a" or $tag eq "img"); my $link; foreach $link (values %links) { $saw{url($link, $base)->abs->as_string}++; } } } }

# печать ссылок print join("<br>\n", sort keys %saw), "<hr>\n";

Это работающий пример Вы можете посмотреть здесь: http://dolgov.hut.ru/cgi-bin/linkextr.pl?http://dolgov.hut.ru

Если Вы еще не ощутили силу автоматизации, в следующих статьях я постараюсь показать ее мощь, в частности для создания счетчиков и рейтингов «аля Ranker». Продолжение следует…

Ссылки по теме:

© Долгов Сергей, 07.06.2001

 

[ В начало раздела ]


 

 

Все для web-дизана!!! Бард-Путеводитель Много Всего CGI-Гид. Лучшие скрипты... WDH - WebDesignHelp - CGI, JAVA, APPLETS, TOP100! Раскрутка, увеличение посещаемости и индекса цитируемости в поисковых системах.

© 2000-2002 Долгов Сергей

dolgov_sergei@mail.ru

X