[SP-pm] use WWW::Mechanize

Gabriel Vieira gabriel.vieira at gmail.com
Fri Sep 19 20:30:25 PDT 2008


Daniel,

isso ocorre pelo simples motivo de existir nenhuma a tag <a
href="qlqrcoisa" mais_atributos_aqui>. Sendo assim o match vai agrupar
em $1 tudo que está entre <a href=" e ">, ou seja, o match só irá
parar quando encontrar um "> e isso demora um pouco a acontecer, tanto
que o seu retorno para $1 é imenso.

Tente:
---------------------8<---------------------
print $1 for $busca=~ /<a href="http:\/\/(.+?)"/;
--------------------->8---------------------

Ou:
---------------------8<---------------------
print $1 for $busca=~ /<a href="http:\/\/(.+?)".*?>/;
--------------------->8---------------------

Ou para ficar mais legível:
---------------------8<---------------------
print $1 for $busca =~ m#<a href="http://(.+?)".*?>#;
--------------------->8---------------------

Lembre-se que esse match retornará apenas 1 único resultado por ele
não possuir o operador 'g' ao fim da instrução.

Utilizando-se da opção 'g' e do for ele ele irá retornar a $1 o valor
do último match com sucesso a quantidade de vezes que os matchs
obtiveram sucesso, no caso o link para a Folha On Line.

Sendo assim indico o uso do while. "Mas com o while ele não entraria
em loop infinito já que sempre vai existir o match na string busca?".
Se utilizarmos o operador 'c', não.

Logo, teremos:
---------------------8<---------------------
print $1,$/ while $busca =~ m#<a href="http://(.+?)".*?>#gc;
--------------------->8---------------------

Uma última dica legal, caso queira gerar um array com todos os matchs
bastaria o seguinte:
---------------------8<---------------------
my @matchs = $busca =~ m#<a href="http://(.+?)".*?>#g;
---------------------8<---------------------

Mais informações: perldoc perlop

Abraços,

2008/9/19 Daniel de Oliveira Mantovani <daniel.oliveira.mantovani em gmail.com>:
> Fiz o que você disse do while, e deu outro erro.
>
> Error: no "print" mailcap rules found for type "text/x-perl"
>
> Não tenho ideia do que seja "mailcap".
>
>
> 2008/9/19 Daniel de Oliveira Mantovani <daniel.oliveira.mantovani em gmail.com>
>>
>> #!/usr/bin/perl
>>
>> use strict;
>> use warnings;
>> use WWW::Mechanize;
>>
>> my $google = WWW::Mechanize->new();
>> my $url =
>> 'http://www.google.com.br/search?hl=pt-BR&q=nasa&btnG=Pesquisa+Google&meta';
>> $google->get($url);
>> my $busca = $google->content();
>> print $1 for $busca=~ /<a href="http:\/\/(.+?)">/;
>>
>> Desculpa pela demora.
>> A coisa que não entra na minha cabeça é eu ponho print $1, e imprime tudo
>> que não está entre os parênteses.
>>
>> 2008/9/19 André Garcia Carneiro <andre.garcia.carneir em terra.com.br>
>>>
>>> Daniel...
>>>
>>>
>>> No while que eu enviei. Tira o 'm'. Esse é um problema. Mas devem ter
>>> mais no código, então manda pra mim, se
>>> puder é claro, caso contrário posta aqui. Não posso entrar no IRC agora,
>>> mas assim q tiver uma brecha aqui no
>>> meu trabalho eu te mando a correção. Prometo testar dessa vez...rsrsr!
>>>
>>>
>>> Cheers!
>>>
>>>
>>> ---------- Cabeçalho original -----------
>>>
>>> De: saopaulo-pm-bounces+andre.garcia.carneir=terra.com.br em pm.org
>>> Para: "saopaulo-pm" saopaulo-pm em mail.pm.org
>>> Cópia:
>>> Data: Fri, 19 Sep 2008 15:43:47 -0300
>>> Assunto: Re: [SP-pm] use WWW::Mechanize
>>>
>>> >
>>> > Falha minha. Esqueci disso...
>>> >
>>> >
>>> > E nao testei o código também.
>>> >
>>> >
>>> > Sorry!
>>> >
>>> >
>>> > ---------- Cabeçalho original -----------
>>> >
>>> > De: saopaulo-pm-bounces+andre.garcia.carneir=terra.com.br em pm.org
>>> > Para: saopaulo-pm em mail.pm.org
>>> > Cópia:
>>> > Data: Fri, 19 Sep 2008 14:49:28 -0300
>>> > Assunto: Re: [SP-pm] use WWW::Mechanize
>>> >
>>> > > Você pode fazer regexes com m/ regexp aqui / .
>>> > >
>>> > > Também pode com m{ .... } , m@ ..... @ ,  m( .... ) , etc..
>>> > >
>>> > > Mas se você tá usando m/ ..... / , o que acontece quando tem mais um
>>> > > "/" no
>>> > > meio da regex ? O perl vai achar que a regexp acabou ali. Então, ou
>>> > > usa-se
>>> > > outros delimitadores, ou se escapa a "/", com uma "\", pra ele não
>>> > > achar que
>>> > > a "/" terminou a regexp:
>>> > >
>>> > > m/<a href="http:\/\/(.+?)"/sig
>>> > >
>>> > > ou
>>> > >
>>> > > m{<a href="http://(.+?)"}sig
>>> > >
>>> > > ou até mesmo
>>> > >
>>> > > m;<a href="http://(.+?)";sig # se você tá participando de um concurso
>>> > > de
>>> > > código ofuscado :-)
>>> > >
>>> > > []s
>>> > > Wendel
>>> > >
>>> > > 2008/9/19 Daniel de Oliveira Mantovani
>>> > > <daniel.oliveira.mantovani em gmail.com>
>>> > >
>>> > > > while($string =~ m/< a href="http://(.+?)"/sig){
>>> > > >     print "\n".$1; #Agora vou pegar todos!
>>> > > > }
>>> > > >
>>> > > >
>>> > > >
>>> > >
>>> >
>>> > --
>>> > André Garcia Carneiro
>>> > Developer(Perl/PHP)
>>> > Member of "São Paulo Perl Mongers" - http://sao-paulo.pm.org
>>> >
>>> > _______________________________________________
>>> > SaoPaulo-pm mailing list
>>> > SaoPaulo-pm em pm.org
>>> > http://mail.pm.org/mailman/listinfo/saopaulo-pm
>>> >
>>>
>>> --
>>> André Garcia Carneiro
>>> Developer(Perl/PHP)
>>> Member of "São Paulo Perl Mongers" - http://sao-paulo.pm.org
>>>
>>> _______________________________________________
>>> SaoPaulo-pm mailing list
>>> SaoPaulo-pm em pm.org
>>> http://mail.pm.org/mailman/listinfo/saopaulo-pm
>>
>>
>>
>> --
>> Daniel de Oliveira Mantovani
>> "A sede pelo aprendizado é insaciável"
>> http://mantovanihouse.blogspot.com/
>> ------------------------------------------------------------
>
>
>
> --
> Daniel de Oliveira Mantovani
> "A sede pelo aprendizado é insaciável"
> http://mantovanihouse.blogspot.com/
> ------------------------------------------------------------
>
> _______________________________________________
> SaoPaulo-pm mailing list
> SaoPaulo-pm em pm.org
> http://mail.pm.org/mailman/listinfo/saopaulo-pm
>



-- 
Gabriel Vieira


More information about the SaoPaulo-pm mailing list