[SP-pm] Retirar conteúdo de Tabela

André Garcia Carneiro andre.garcia.carneir at terra.com.br
Thu Nov 27 09:12:08 PST 2008


2008/11/27 Daniel de Oliveira Mantovani <daniel.oliveira.mantovani em gmail.com>

>    Olá Monges!

>    Estou tentando retirar o conteúdo de uma tabela:
>    http://www.magicdomain.com.br/index.php?sub=colecoes&idSerie=57

>    No caso eu só quero o nome e o preço.
>    Tag => td
>    Class => titulosNome

>    Tag => td
>    Class => titulosPreco

>    Dentro da tag td e da classe titulosNome quero pegar só o nome. Porém não estou achando uma forma.
>    Olhem meu script:
>    http://scsys.co.uk:8001/20980




Que nome? Bota um exemplo do código HTML, e diga exatamente o que você quer, por favor...
 


>    Eu sei que está tudo errado, eu pequei um modelo, pra ser exacto o modelo que o André passou aqui na lista.


Não me culpe se você ainda não aprendeu a usar o módulo. Eu uso isso todo o santo dia. Com certeza eu sabia do
que eu tava falando...
 


>    Não entendi, como funciona o módulo para fazer o parser.



É, você não entendeu mesmo, pois bem, vamos lá:

Dado uma tabela escrita em HTML:

<table id='table_001' class='t1'>
      <tr>
                   <td id='td_tituloprod_001'>Titulo da Imagem</td>
                   <td id='td_imagem_001'><img src='http://www.algumhost.com.br/imagens/imagem_001.jpg'></td>
      </tr>
</table>


HTML::TreeBuilder - Faz o parser(utilizando HTML::Parser e outros módulos), para devolver um objeto, que na
verdade é uma lista de objetos HTML::Element organizados em forma de árvores(grosseiramente é isso). Se você
estiver familiarizado com uma estrutura de árvore, saberá que cada nó de uma árvore pode ter nós e ramos, e é
exatamente disso que a estrutura de um objeto HTML::TreeBuider trata.

Imagine uma árvore de cabeça para baixo, onde a raíz é um objeto que representa o documento HTML inteiro, e os
nós abaixo desse objeto, também são objetos que representam as tags HTML do documento.

No código acima, o nó raiz é o código todo. Mas suponhamos que eu quisesse a informação que está em um dos
'tds', por exemplo, o Título da imagem1( o texto), como fazer isso com HTML::TreeBuider?

<code>
#! /usr/bin/perl -w;
use strict;
use HTML::TreeBuider;
my $htmlcode = "
<table id='table_001' class='t1'>
      <tr>
                   <td id='td_tituloprod_001'>Titulo da Imagem1</td>
                   <td id='td_imagem_001'><img src='http://www.algumhost.com.br/imagens/imagem_001.jpg'></td>
      </tr>
      <tr>
                   <td id='td_tituloprod_002'>Titulo da Imagem2</td>
                   <td id='td_imagem_002'><img src='http://www.algumhost.com.br/imagens/imagem_001.jpg'></td>
      </tr>

</table>
";

#Nesse momento, eu tenho o objeto que representa o código HTML inteiro.
my $tree = HTML::TreeBuider->new_from_content($htmlcode);
#Capturando a informação do td
my $td              = $tree->look_down(_tag => 'td',id=>'td_tituloprod_001');
my $texto        = $td->as_text if $td;
print "\n$texto";#O resultado disso, se os nomes dos atributos estiverem corretos será 'Titulo da Imagem 1'
</code>

Repare que nesse caso, eu fui direto no nó que representa o código HTML '<td id='td_tituloprod_001'>Titulo da
Imagem1</td>', através do método 'look_down'. Esse método, permite que eu olhe a partir de um nó, para os seus
filhos, ou seja, se você lembrar da imagem da árvore de cabeça para baixo, eu na verdade estou dizendo ao
objeto para olhar para os objetos 'abaixo'... Existe o método look_up também, mas pra facilitar, vamos nos
atentar em look_down.

Para o problema que estou tentando te explicar, look_down foi feito a partir do objeto '$tree', ou seja, a
partir do nó raiz da árvore. Isso significa que eu poderia ter alcançado qualquer outra tag(ou nó) da árvore,
já que é o nó raiz. Pois bem, uma vez que eu guardei esse objeto em $td - lembre-se:'my $td              =
$tree->look_down(_tag => 'td',id=>'td_tituloprod_001');', agora eu tenho em $td um objeto que representa a tag
'<td id='td_tituloprod_001'>Titulo da Imagem1</td>'. Repare que, a partir de '$td', seguindo o conceito de
árvore, eu não consigo chegar a nó nenhum abaixo dele, porque não existe nenhuma tag dentro da 'td', com o
método look_down, pois já cheguei na 'folha' da árvore, ou seja, não há mais ninguém abaixo.

É a mesma coisa se vc for pensar em diretórios, suponha que eu tenha a seguinte estrutura:

perl
   |
   ->rules
               |
               ->the
                   |
                   ->world

foo
|
->subfoo


Uma vez que eu tenha percorrido os diretórios até 'world'. Não há mais nada abaixo dele, portanto não tem como
acessar alguma coisa abaixo dele. Se eu quisse acesar o diretório 'subfoo', a partir de world, teria que subir
os diretórios para depois descer novamente e chegar em subfoo. HTML::TreeBuider funciona da mesma forma.
Transferindo a analogia do sistema de diretórios para as tags HTML, teria-se o seguinte:


table id='table_001' class='t1'
|
->tr
    |
    ->td id='td_tituloprod_001'>Titulo da Imagem1

No entanto, existem uma diferença importante. Diferentemente da analogia com os diretórios, não necessariamente
eu tenho que percorrer todos os nós um a um para chegar no meu objetivo, desde que o nó que se quer alcançar,
esteja abaixo do nó onde se está no momento, ou seja, para alcançar o meu td, eu não tive que passar por 'tr',
para depois ir a td. Posso ir direto ao 'td' que quero alcançar, porque no caso estava no nó raiz do objeto.

Outra coisa importante, é que você pode colocar tudo em contexto de array, por exemplo, se eu quisesse, nesse
código capturar todos os tds, eu chamaria o look_down dessa maneira:

<code>
my @tds = $tree->look_down(_tag => 'td');
</code>

Aí eu tenho uma lista com todos os tds abaixo do nó raiz.

Acho que consegui colocar o conceito para você. O resto você pode ver lendo a documentação e perguntando por
aqui na lista. E poste os seus códigos por favor pra ver em que pé que está.


Cheers!


 


>    -- 
>    Procuro emprego C.V:
>    http://www.danielmantovani.site50.net/

>    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




-- 
André Garcia Carneiro
Analista/Desenvolvedor Perl




More information about the SaoPaulo-pm mailing list