[SP-pm] Extrair conteúdo HTML. WWW::Mechanize ?

breno breno at rio.pm.org
Tue Oct 14 15:16:09 PDT 2008


Daniel,

infelizmente pelo que vi o site em questão usa tabelas e não trabalha
com ids, então o scraping será mais passível de problemas (leia-se "se
mudarem alguma coisa no layout seu script provavelmente vai parar de
funcionar").

Sobre o trecho de código:

>     foreach ( split("\n",$data->content()) ) {
>         if ( m{</strong><br><i>  \(  (.+?)  \)  </i></td>}igx ) {
>         push(@filmes,$1);

Você pode trocar por algo como:


if ( $data->success() ) {
        @filmes = $data->content() =~ m{<br><i>\((.+?)\)</i></td>}gs;
}

me parece mais rápido (menos operações) e legível, além dar a deixa
para vc lidar com o caso de erro no get() que vc faz na linha acima.

Como alternativa à regexp, você pode passear pela árvore HTML usando
HTML::TableContentParser ou com outros módulos de scraping como o
pQuery ou o Web::Scraper:

[]s

-b


2008/10/14 Daniel de Oliveira Mantovani <daniel.oliveira.mantovani em gmail.com>:
> print "Bom dia\n" if day == manha;
> print "Boa tarde\n" if day == tarde;
> print "Boa noite\n" if day == noite;
>
> Bom pessoal como vocês disseram que não é bom usar Expressões Regulares para
> extrair conteúdo HTML, e pelo que vi no manual do WWW::Mechanize, porém eu
> não consigo extrair com a mesma eficácia.
>
> Essa parte do código:
>
>     foreach ( split("\n",$data->content()) ) {
>         if ( m{</strong><br><i>  \(  (.+?)  \)  </i></td>}igx ) {
>         push(@filmes,$1);
>
> Quero usar o WWW::Mechanize para extrair essa parte.
> Olhei os exemplos do WWW::Mechanize:
> http://search.cpan.org/~petdance/WWW-Mechanize-1.34/lib/WWW/Mechanize/Examples.pod
> e vi que o autor usou Expressões Regulares para extrair:
> @bits = $r =~ m{<TD.*?>(.*?)</TD>}gs;
>
> O meu projeto abaixo:
>
>
> #!/usr/bin/perl
>
> use strict;
> use warnings;
> use WWW::Mechanize;
> use WWW::Search::Mininova;
>
> {package Hgtorrent;
>
> sub Nomes
>  {
>  my $self = shift;
>  my @filmes = ();
>  my $data = WWW::Mechanize->new();
>  $data->get('http://www.hgcinema.com.br/programacao/index.php');
>     foreach ( split("\n",$data->content()) ) {
>         if ( m{</strong><br><i>  \(  (.+?)  \)  </i></td>}igx ) {
>         push(@filmes,$1);
>         }
>     }
>  return @filmes;
>  }
>
> sub Procurar
>  {
>  my $self = shift;
>  my $busca = shift;
>  my $mini = WWW::Search::Mininova->new( category => 'Movies',sort => 'Seeds'
> ,);
>  $mini->search("$busca");
>  my $result = $mini->result;
>     if (defined $result->{name}) {
>     print "Name: ", $result->{name},$/,
>     "Seeds: ", $result->{seeds},$/,
>     "Leechers: ", $result->{leechers},$/,
>     "Uri: ", $result->{uri},$/,
>     "Download uri: ", $result->{download_uri},$/,
>     "Size: ", $result->{size},$/,
>     "Category: ", $result->{category},$/,
>     "Sub Category: ", $result->{subcategory},$/,
>     "Added data: " ,$result->{added_date},$/;
>      }
>     else {
>     print "Not Found\n";
>     }
>  }
>
>
> }
>
> -D-----> Abraço
> --
> print
> "\x54\x68\x65\x20\x53\x69\x6c\x65\x6e\x74\x20\x47\x75\x61\x72\x64\x69\x61\x6e",$/
>
> _______________________________________________
> SaoPaulo-pm mailing list
> SaoPaulo-pm em pm.org
> http://mail.pm.org/mailman/listinfo/saopaulo-pm
>


More information about the SaoPaulo-pm mailing list