YQL! Parte 2: Criando novas tabelas

Recapitulando

No primeiro post (leia aqui) eu falei sobre a busca de dados públicas na web e da utilização básica das tabelas do YQL! e a criação de queries através de tabelas já existentes dentro do próprio serviço (sejam do próprio Yahoo! ou desenvolvidas por outras pessoas).

E quando não existe uma tabela pronta?

Existem tabelas no YQL! para realizarmos diversas pesquisas sobre os mais variados tipos de informação. No entanto, apesar do YQL! disponibilizar essas tabelas para que possamos consultar informações, nem sempre existirá uma tabela para o que desejamos buscar. O que fazemos nesse caso?

Consultando informações de forma genérica

Para permitir que possamos consultar informações de variadas fontes, o próprio YQL! disponibiliza uma tabela chamada “html”. Essa tabela permite que seja feita requisições para qualquer URL procurando por algo dentro da resposta gerada. A pesquisa dentro do HTML é feita através de XPath, que é uma linguagem para fazer buscas dentro de documentos XML. (Caso você não conheça XPath, ou é como eu que vive esquecendo a sintaxe, uma boa referência é a seção no site da w3schools dedicada ao assunto.)

Para mostrar como fazer uma pesquisa genérica, vou utilizar como exemplo o calendário de cursos disponível na página inicial do site da Caelum. Para extrair as informações da tabela, o XPath adequado é o seguinte:

//div[@id='calendario']/table/tbody/tr

Traduzindo o comando: Em qualquer lugar do documento, busque uma div cujo id é calendario e dentro dessa div eu quero todos os tr que vão estar dentro de um tbody que vai estar dentro de um table.

Com isso, podemos montar nossa query da seguinte forma no YQL!:

select * from html where xpath="//div[@id='calendario']/table/tbody/tr" and url="http://www.caelum.com.br"

Ao executar essa query no console do YQL! o resultado retornado será todas as Tags <tr> da listagem dos cursos.

Criando sua própria tabela da forma simples

Agora que conseguimos realizar nossa consulta e buscamos as informações desejadas, podemos começar a melhorar os nossos resultados. O primeiro ponto é que deixar esse XPath explícito na query pode não ser algo tão agradável dependendo da utilização e situação. Nesse caso, queremos que a nossa consulta seja executada com um simples:

select * from caelum.proximoscursos

e ainda assim a query original deve ser executada. Muito mais agradável, não? Para isso, precisamos criar a nossa própria tabela.

O processo de criação de uma tabela do YQL! não é complicado, apesar que precisamos lidar com alguns XMLs a princípio. Primeiramente, precisamos criar um arquivo .xml com o nome de nossa tabela, nesse caso caelum.proximoscursos.xml. E definir alguns meta-dados, como autor e descrição da tabela. Além disso, no mesmo XML, dizemos qual é a query que deverá ser executada. Isso é feito através de um simples código Javascript, que é executado quando a query for disparada.

Esse Javascript fica dentro das Tags <bindings><select><execute> dentro do XML e é executado quando invocamos a tabela. Para executarmos a consulta, basta nesse Javascript adicionarmos o seguinte código:

var url = 'http://www.caelum.com.br';
var xpath = "//div[@id='calendario']/table/tbody/tr";
response.object = y.query('select * from html where url="' + url + '" and xpath="' + xpath + '"').results;

O objetivo desse código é fazer uma chamada ao serviço de queries do Yahoo! através da função query() passando a consulta que desejamos realizar e mandamos recuperar seu resultado. Nada mais que isso.

O resultado final desse XML pode ser visto em: http://ahalmeida.me/tabelas_yql/caelum.proximoscursos_html.xml

E para executá-lo no console do YQL!, basta importá-lo adicionando antes da query o comando “use” e executar a consulta:

use 'http://ahalmeida.me/tabelas_yql/caelum.proximoscursos_html.xml';
select * from caelum.proximoscursos_html;

Pronto! Tabela criada e pronta para o uso.

Complicando mais a tabela para melhorar os resultados

A tabela criada anteriormente possui um grande problema. Os dados retornados por ela ainda estão no meio de um HTML, cheio de formatação e sem nenhuma semântica com relação ao domínio da informação que desejamos buscar. Para melhorar isso, é preciso usar um pouquinho de Javascript para formatar o resultado que a query devolverá.

A ideia é que seja feito um parse do HTML retornado, para que seja devolvido um XML ou um JSON para que fique mais fácil trabalhar com as informações retornadas.

Para isso, é preciso escrever um pouco mais de Javascript na Tag <execute>. Diferentemente da tabela que retorna o proprio HTML, agora é precisar tomar algumas decisões sobre esse HTML e gerar um novo XML. Para parsear e criar um novo XML, uma forma possível de fazer isso no Javascript é através do E4X (ECMAScript for XML), para conhecer mais e aprender como usar, vale uma lida aqui.

Com o E4X é possível navegar no XML e realizar verificações e pegar valores. Com isso, pode-se a partir do resultado da query pegar as tags <tr> do mesmo da seguinte forma:

trs = query.results.tr;

E em seguida é possível iterar sobre todos os <tr> através do for each:

for each(var tr in trs) { ... }

Devido à estrutura do HTML retornado pela pesquisa, é retornado também um <th> com o nome do agrupamento por mês dos cursos, que não é necessário no retorno da pesquisa, por isso, podemos verificar se existe um elemento desse tipo dentro do <tr> e caso exista, ignoramos essa linha. Isso é possível, entre outras formas, através da seguinte verificação:

if(tr.elements('th').length() == 0) { /* entao não é a coluna do agrupamento do mês e podemos pegar os resultados */ }

Com isso agora é possível iterar sobre as células (<td>) da coluna e recuperar seus valores. Dessa forma haverá um outro for each para iterar nas células, e dentro de cada célula haverá uma verificação para saber em qual célula o for está posicionado no momento e com isso retirar a informação do HTML de forma adequada (dentro de um link, de uma tag <p> ou do atributo “title” do <td>).

O código completo dessa tabela pode ser encontrada no meu repositório no github (em breve vou mandar o pull request pro repositório oficial, quero fazer umas melhorias antes, como uns filtros por unidade :) ).

E para vê-la em produção, você pode executar o seguinte comando:

use 'http://ahalmeida.me/tabelas_yql/caelum.proximoscursos.xml'; select * from caelum.proximoscursos;

Conclusão

Criar tabelas no YQL! não é uma tarefa difícil, no entanto, as vezes pode ser uma tarefa um pouco maçante, por conta de todo o parsing do resultado da query. De qualquer maneira, é um código que será escrito uma vez e que raramente irá se alterar. Para saber TODOS os detalhes possíveis sobre a criação e utilização das tabelas, recomendo uma lida com calma na documentação do YQL!. No próximo post vou falar sobre como utilizar essa tabela criada em uma aplicação web.

About these ads

One Response to YQL! Parte 2: Criando novas tabelas

  1. Pingback: YQL! Parte 3: Usando tabelas do YQL! em uma aplicação Ruby e Java com Restfulie « Ahalmeida's Weblog

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

Seguir

Obtenha todo post novo entregue na sua caixa de entrada.

%d blogueiros gostam disto: