Tem um problema que é o seguinte. O módulo pode matar o programa com die, se você fizer algo do tipo<br><br>&lt;code&gt;<br>$tree-&gt;look_down(_tag =&gt; &#39;a&#39;)-&gt;attr(&#39;href&#39;);<br>&lt;/code&gt;<br><br>Isso pode gerar um &#39;die&#39;, se o objeto $tree estiver &#39;unblessed&#39;. Resumindo, você deve ser explícito e ter sempre certeza que existe alguma coisa nos teus objeto, de preferência um objeto &#39;HTML::Element&#39;.. ;)<br>
<br>Algo assim:<br><br>&lt;code&gt;<br>use strict;<br>use HTML::TreeBuider;<br>use WWW::Mechanize;<br><br>my $mech&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = WWW::Mechanize-&gt;new();<br>$mech-&gt;get(&#39;some_url&#39;);<br>if($mech-&gt;success){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(my $tree = HTML::TreeBuilder-&gt;new_from_content($string);){<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(my $url = $tree-&gt;look_down(_tag =&gt; &#39;a&#39;)){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $url = $url-&gt;attr(&#39;href&#39;);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>
}<br>else{<br>#trate o erro aqui.<br>}<br><br>&lt;/code&gt;<br><br>Repare que para os &#39;ifs&#39; internos eu não abri espaço para tratar erros. Por que? Simplesmente porque não se trata de um erro realmente. Como designers quase sempre pisam na bola com a questão de estrutura dos HTMLs, você precisa se certificar que o seu programa não vai parar, só porque um mané não sabe escrever HTML direito. <br>
<br><br>É claro que esse exemplo acima explica exatamente o que eu quero dizer, mas vou dar um exemplo mais genérico. Considere o seguinte segmento de código HTML abaixo:<br>&lt;code&gt;<br>&lt;!-- um montão de coisa em HTML aqui.. --&gt;<br>
&lt;tr&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp; &lt;td&gt;produto1&lt;/td&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp; &lt;td&gt;R$ 30,00&lt;/td&gt;<br>&nbsp;&lt;/tr&gt;<br>&lt;tr&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp; &lt;td&gt;produto2<br>&nbsp;&nbsp;&nbsp;&nbsp; &lt;div&gt;PRODUTO EM FALTA&lt;/div&gt; &lt;!-- acredite, eu já tive que lidar com coisa bem pior que isso --&gt;<br>
&nbsp;&nbsp;&nbsp; &lt;/td&gt;<br>&lt;/tr&gt;<br>&lt;!-- mais um montão de coisa em HTML aqui --&gt;<br>&lt;/code&gt;<br><br><br>Percebe o problema? Se você tivesse um loop, onde você esperasse uma td que não existe, você precisaria tratar isso, caso contrário o seu programa vai parar.<br>
<br>Essas mudanças de padrão, HTMLs mal-estruturados, são mais chatos de tratar, porque você precisa ficar &#39;caminhando&#39; na árvore de objetos, isso supondo que o HTML está consistente o suficiente(sem tags abertas perdidas e porcarias do tipo), para você conseguir chegar onde você precisa.<br>
<br><br><br>Cheers!<br><br><br><div class="gmail_quote">2009/1/20 Blabos de Blebe <span dir="ltr">&lt;<a href="mailto:blabos@gmail.com">blabos@gmail.com</a>&gt;</span><br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Desculpem ser chato, mas quando eu usei o HTML::TreeBuilder, precisei<br>
mudar para algo como:<br>
<br>
&lt;code&gt;<br>
my $tag = $tree_cidade-&gt;look_down(_tag =&gt; &#39;a&#39;);<br>
my $url = $tag ? $tag-&gt;attr(&#39;href&#39;) : &#39;&#39;;<br>
&lt;/code&gt;<br>
<br>
Porque se o look_down não encontrar &nbsp;a tag &lt;a&gt; ele vai retornar undef.<br>
Daí tentar encadear uma chamada a attr() sobre o undef vai dar caca.<br>
<br>
Quando eu precisei fazer isso, haviam vários pontos problemáticos<br>
assim, os quais eram verbosos para tratar. Eu sempre queria fazer as<br>
chamadas encadeadas como o márcio fez, mas acabava tendo que separar<br>
uma a uma para o caso do look_down não encontrar nada.<br>
<br>
Existem soluções menos verbosas e mais elegantes?<br>
<br>
Abraços<br>
<br>
Wesley<br>
<br>
<br>
<br>
2009/1/19 Daniel de Oliveira Mantovani &lt;<a href="mailto:daniel.oliveira.mantovani@gmail.com">daniel.oliveira.mantovani@gmail.com</a>&gt;:<br>
<div><div></div><div class="Wj3C7c">&gt; Isso mesmo Márcio!<br>
&gt;<br>
&gt; 2009/1/19 Márcio Vitor &lt;<a href="mailto:cromo.jml@gmail.com">cromo.jml@gmail.com</a>&gt;<br>
&gt;&gt;<br>
&gt;&gt; Daniel, vou bicar feio mas acho que você tá querendo algo assim:<br>
&gt;&gt;<br>
&gt;&gt; my $url = $tree_cidade-&gt;look_down(_tag =&gt; &#39;a&#39;)-&gt;attr(&#39;href&#39;);<br>
&gt;&gt;<br>
&gt;&gt; Márcio Vitor<br>
&gt;&gt;<br>
&gt;&gt; 2009/1/18 Daniel de Oliveira Mantovani<br>
&gt;&gt; &lt;<a href="mailto:daniel.oliveira.mantovani@gmail.com">daniel.oliveira.mantovani@gmail.com</a>&gt;<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; Olá pessoal, o André me ensinou uma maneira muito divertida de retirar<br>
&gt;&gt;&gt; conteúdo com HTML::TreeBuilder.<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; Ele ensinou a pegar os atributos com attr(), por exemplo pegar o &lt;a<br>
&gt;&gt;&gt; href=&quot;<a href="http://pegar_isso_aqui.com" target="_blank">http://pegar_isso_aqui.com</a>&quot;&gt; usaria $a-&gt;attr(&#39;href&#39;).<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; Desse jeito funciona perfeitamente:<br>
&gt;&gt;&gt; &lt;code&gt;<br>
&gt;&gt;&gt; &nbsp; my @cidades = $tree_page-&gt;look_down(_tag =&gt; &#39;li&#39;);<br>
&gt;&gt;&gt; &nbsp; foreach my $cidade (@cidades) {<br>
&gt;&gt;&gt; &nbsp; &nbsp; &nbsp;my $html = $cidade-&gt;as_HTML;<br>
&gt;&gt;&gt; &nbsp; &nbsp; &nbsp;my $tree_cidade = HTML::TreeBuilder-&gt;new_from_content($html);<br>
&gt;&gt;&gt; &nbsp; &nbsp; &nbsp;$tree_cidade-&gt;look_down(_tag =&gt; &#39;a&#39;);<br>
&gt;&gt;&gt; &nbsp; &nbsp; &nbsp;$tree_cidade-&gt;as_HTML =~ m{href=&quot;(.+?)&quot;};<br>
&gt;&gt;&gt; &nbsp; &nbsp; &nbsp;push(@estados,&quot;$1/bairros&quot;) if $1 !~ m{cidade};<br>
&gt;&gt;&gt; &lt;/code&gt;<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; Porém do jeito que seria o correto não funciona:<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; &lt;code&gt;<br>
&gt;&gt;&gt; &nbsp; my @cidades = $tree_page-&gt;look_down(_tag =&gt; &#39;li&#39;);<br>
&gt;&gt;&gt; &nbsp; foreach my $cidade (@cidades) {<br>
&gt;&gt;&gt; &nbsp; &nbsp; &nbsp;my $html = $cidade-&gt;as_HTML;<br>
&gt;&gt;&gt; &nbsp; &nbsp; &nbsp;my $tree_cidade = HTML::TreeBuilder-&gt;new_from_content($html);<br>
&gt;&gt;&gt; &nbsp; &nbsp; &nbsp;$tree_cidade-&gt;look_down(_tag =&gt; &#39;a&#39;);<br>
&gt;&gt;&gt; &nbsp; &nbsp; &nbsp;my $url = $tree_cidade-&gt;attr(&#39;href&#39;);<br>
&gt;&gt;&gt; 39 push(@estados,&quot;$url/bairros&quot;) if $url !~ m{cidade};<br>
&gt;&gt;&gt; &lt;/code&gt;<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; Da o seguinte erro:<br>
&gt;&gt;&gt; &lt;erro&gt;<br>
&gt;&gt;&gt; Use of uninitialized value $url in concatenation (.) or string at<br>
&gt;&gt;&gt; <a href="http://vcvai-0.01.pl" target="_blank">vcvai-0.01.pl</a> line 39.<br>
&gt;&gt;&gt; &lt;/erro&gt;<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; Se eu tento dar um print &quot;$url\n&quot;; da o mesmo erro na linha do print.<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; Tentei de várioas maneiras e nada!<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; []&#39;s<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; 2008/11/28 Nelson Ferraz &lt;<a href="mailto:nferraz@gmail.com">nferraz@gmail.com</a>&gt;<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; Muito boa explicacão, André.<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; Que tal colocá-la no wiki, pra facilitar a nossa vida mais tarde?<br>
&gt;&gt;&gt;&gt; (Para nós e para outras pessoas :))<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; Sugiro colocá-lo na forma de uma Receita:<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; ---<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; &nbsp; &nbsp;Título: Como fazer parsing de HTML<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; &nbsp; &nbsp;Problema: você precisa extrair informacões de um arquivo HTML<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; &nbsp; &nbsp;Solucão: use HTML::TreeBuilder<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; &nbsp; &nbsp;Discussão: (explicacão acima)<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; ---<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; Você pode usar este link para publicar uma nova receita:<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; - <a href="http://www.perl.org.br/bin/viewauth/Artigos/WebReceitaForm" target="_blank">http://www.perl.org.br/bin/viewauth/Artigos/WebReceitaForm</a><br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; []s<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; Nelson<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; --<br>
&gt;&gt;&gt;&gt; Nelson Ferraz<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; Free Software Foundation Associate Member #3203<br>
&gt;&gt;&gt;&gt; Projeto Software Livre Brasil (<a href="http://www.softwarelivre.org.br" target="_blank">www.softwarelivre.org.br</a>)<br>
&gt;&gt;&gt;&gt; Sociedade Perl do Brasil (<a href="http://www.perl.org.br" target="_blank">www.perl.org.br</a>)<br>
&gt;&gt;&gt;&gt; Rede Livre de Compartilhamento de Cultura Digital<br>
&gt;&gt;&gt;&gt; _______________________________________________<br>
&gt;&gt;&gt;&gt; SaoPaulo-pm mailing list<br>
&gt;&gt;&gt;&gt; <a href="mailto:SaoPaulo-pm@pm.org">SaoPaulo-pm@pm.org</a><br>
&gt;&gt;&gt;&gt; <a href="http://mail.pm.org/mailman/listinfo/saopaulo-pm" target="_blank">http://mail.pm.org/mailman/listinfo/saopaulo-pm</a><br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; --<br>
&gt;&gt;&gt; <a href="http://mantovanihouse.blogspot.com/" target="_blank">http://mantovanihouse.blogspot.com/</a><br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; -------(\_------------_/)-----------<br>
&gt;&gt;&gt; -------)--(----------)--(-----------<br>
&gt;&gt;&gt; ------(----(---------)----)----------<br>
&gt;&gt;&gt; -------)----(-------)----(-----------<br>
&gt;&gt;&gt; -------(----(-------)----)-----------<br>
&gt;&gt;&gt; --------\_-(\\.---.//)-_/------------<br>
&gt;&gt;&gt; ----------\)&#39; -8--8- &#39;(/--------------<br>
&gt;&gt;&gt; -----------/------------\---------------<br>
&gt;&gt;&gt; ----------(--)--------(--)--------------<br>
&gt;&gt;&gt; ------------(_c__c_)----------------<br>
&gt;&gt;&gt; ----------------------------------------<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; _______________________________________________<br>
&gt;&gt;&gt; SaoPaulo-pm mailing list<br>
&gt;&gt;&gt; <a href="mailto:SaoPaulo-pm@pm.org">SaoPaulo-pm@pm.org</a><br>
&gt;&gt;&gt; <a href="http://mail.pm.org/mailman/listinfo/saopaulo-pm" target="_blank">http://mail.pm.org/mailman/listinfo/saopaulo-pm</a><br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; _______________________________________________<br>
&gt;&gt; SaoPaulo-pm mailing list<br>
&gt;&gt; <a href="mailto:SaoPaulo-pm@pm.org">SaoPaulo-pm@pm.org</a><br>
&gt;&gt; <a href="http://mail.pm.org/mailman/listinfo/saopaulo-pm" target="_blank">http://mail.pm.org/mailman/listinfo/saopaulo-pm</a><br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt; --<br>
&gt; <a href="http://mantovanihouse.blogspot.com/" target="_blank">http://mantovanihouse.blogspot.com/</a><br>
&gt;<br>
&gt; -------(\_------------_/)-----------<br>
&gt; -------)--(----------)--(-----------<br>
&gt; ------(----(---------)----)----------<br>
&gt; -------)----(-------)----(-----------<br>
&gt; -------(----(-------)----)-----------<br>
&gt; --------\_-(\\.---.//)-_/------------<br>
&gt; ----------\)&#39; -8--8- &#39;(/--------------<br>
&gt; -----------/------------\---------------<br>
&gt; ----------(--)--------(--)--------------<br>
&gt; ------------(_c__c_)----------------<br>
&gt; ----------------------------------------<br>
&gt;<br>
&gt; _______________________________________________<br>
&gt; SaoPaulo-pm mailing list<br>
&gt; <a href="mailto:SaoPaulo-pm@pm.org">SaoPaulo-pm@pm.org</a><br>
&gt; <a href="http://mail.pm.org/mailman/listinfo/saopaulo-pm" target="_blank">http://mail.pm.org/mailman/listinfo/saopaulo-pm</a><br>
&gt;<br>
_______________________________________________<br>
SaoPaulo-pm mailing list<br>
<a href="mailto:SaoPaulo-pm@pm.org">SaoPaulo-pm@pm.org</a><br>
<a href="http://mail.pm.org/mailman/listinfo/saopaulo-pm" target="_blank">http://mail.pm.org/mailman/listinfo/saopaulo-pm</a><br>
</div></div></blockquote></div><br><br clear="all"><br>-- <br>André Garcia Carneiro<br>Analista/Desenvolvedor Perl<br><br>