[Triangulo-pm] Exemplo: Extraindo de texto da web

Adriano Ferreira a.r.ferreira at gmail.com
Wed Dec 6 04:54:21 PST 2006


Entre as várias capacidades de Perl, vale citar:

(1) Perl é forte em protocolos de rede, com suporte
    para uma infinidade deles (SMTP, HTTP, HTTPS,
    POP, LDAP, DNS, etc., etc.)

(2) Expressões regulares são um show de bola.

O exemplo a seguir demonstra o uso (simplório) de LWP
combinado com expressões regulares.

O propósito do código (concentrado na sub fetch)
é fazer o download de uma URL e, se ela combinar
com a expressão regular dada, retornar o primeiro
grupo encontrado.

    #!perl

    use strict;
    use warnings;

    use LWP::UserAgent;

    =over 4

    =item B<fetch>

        my $text = fetch($url, $regex [, $http_proxy]);

    Busca uma página de HTML endereçada por C<$url>
    e, se o conteúdo combina com a expressão regular
    C<$regex>, retorna o texto encontrado.

        my $url = 'http://foo';
        my $text = fetch($url, qr/<h>(.*?)</h>/);
        print "Texto: $text\n" if $text;


    =back

    =cut

    sub fetch {
        my $url = shift;
        my $regex = shift;
        my $http_proxy = shift;

        my $ua = LWP::UserAgent->new;
        $ua->proxy(['http'], $http_proxy) if $http_proxy;
        my $r = $ua->get($url);
        if ($r->is_success) {
            return ($r->content =~ /$regex/) ? $1 : undef;
        } else {
            die $r->status_line;
        }
    }

    my $url = 'http://mail.pm.org/pipermail/triangulo-pm/2006-December/thread.html';

    my $re = qr|<LI><A HREF="\d+\.html">\[Triangulo-pm\] (.*?)$|m;
    # Esta expressão regular foi projetada para combinar e extrair
    # "Perl em Windows" em textos como:
    # <LI><A HREF="000001.html">[Triangulo-pm] Perl em Windows

    # tire o comentário e edite se você está atrás de um proxy
    #my $proxy = 'http://user:pass@proxy-name-or-ip:3128/';
    # como estou atrás de um proxy com autenticação, preciso
    # de definir este terceiro argumento (que é opcional)
    # com usuário e senha

    my $text = fetch($url, $re, $proxy);
    print "Texto: $text\n" if $text;

O download é feito com o módulo LWP::UserAgent (que embora não faça
parte da distribuição padrão) já vem instalado com ActiveState Perl
e não deve ser difícil de instalar nas outras configurações.

O exemplo dado busca a lista de mensagens do Triangulo-pm at pm.org
neste mês de dezembro e retorna o título da primeira mensagem
na página. Para construir a expressão regular correspondente,
foi usado um browser para visualizar o HTML da página e
então escrever algo que funcionasse.

Fora as inumeráveis linhas de comentários do exemplo, o núcleo
do código é bem pequeno e pode ser facilmente estendido para
fazer coisas mais úteis: todas as ocorrências da regex,
explorar diversas páginas, etc.

Dúvidas, comentários, correções: são todos bem vindos.

Adriano Ferreira

P.S. Para facilitar a vida de quem gostaria de experimentar com o
código acima, eu o repeti no attachment sem a indentação usada aqui na
mensagem.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: fetch.pl
Type: application/octet-stream
Size: 1328 bytes
Desc: not available
Url : http://mail.pm.org/pipermail/triangulo-pm/attachments/20061206/b4be39db/attachment.obj 


More information about the Triangulo-pm mailing list