<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>ArthurGeek.net &#187; parsing</title>
	<atom:link href="http://www.arthurgeek.net/tag/parsing/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.arthurgeek.net</link>
	<description>Rails, Mac... e Rock'n Roll!</description>
	<lastBuildDate>Sat, 20 Dec 2008 23:25:15 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Mostrando a Colocação do Brasil no Pan 2007, usando Ruby!</title>
		<link>http://www.arthurgeek.net/mostrando-a-colocao-do-brasil-no-pan-2007-usando-ruby/</link>
		<comments>http://www.arthurgeek.net/mostrando-a-colocao-do-brasil-no-pan-2007-usando-ruby/#comments</comments>
		<pubDate>Tue, 17 Jul 2007 14:57:00 +0000</pubDate>
		<dc:creator>ArthurGeek</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[parsing]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://www.arthurgeek.net/2007/07/17/mostrando-a-colocao-do-brasil-no-pan-2007-usando-ruby</guid>
		<description><![CDATA[Como estou no trabalho, e por aqui não tem uma TV por perto, estava acessando demais o quadro de medalhas do Terra. Então, pensei: porque não fazer um programinha Ruby que me retornasse a colocação e as medalhas do Brasil?
Então, mãos à obra!

O que é preciso?
Vou usar a excelente biblioteca de parser HTML chamada Hpricot.
O [...]]]></description>
			<content:encoded><![CDATA[<p>Como estou no trabalho, e por aqui não tem uma TV por perto, estava acessando demais <a href="http://agendapan.terra.com.br/br/medalhas/medalheiro.html">o quadro de medalhas do Terra</a>. Então, pensei: porque não fazer um programinha Ruby que me retornasse a colocação e as medalhas do Brasil?</p>
<p>Então, mãos à obra!</p>
<p><span id="more-71"></span></p>
<h3>O que é preciso?</h3>
<p>Vou usar a excelente biblioteca de parser <span class="caps">HTML</span> chamada <a href="http://code.whytheluckystiff.net/hpricot/">Hpricot</a>.</p>
<h3>O código <span class="caps">HTML</span> do Terra</h3>
<p>Vamos analisar o código <span class="caps">HTML</span> da página que mostra <a href="http://agendapan.terra.com.br/br/medalhas/medalheiro.html">o quadro de medalhas do Terra</a>.</p>
<p>O quadro de medalhas está dentro de uma tabela com a classe: <em>tab_med</em></p>
<pre class="html4strict"><code><span class="sc2"><span class="kw2">&lt;table</span> <span class="kw3">width</span>=<span class="st0">"100%"</span> <span class="kw3">border</span>=<span class="st0">"0"</span> <span class="kw3">cellpadding</span>=<span class="st0">"0"</span> <span class="kw3">cellspacing</span>=<span class="st0">"1"</span> <span class="kw3">class</span>=<span class="st0">"tab_med"</span><span class="kw2">&gt;</span></span></code></pre>
<p>Dentro desta tabela, temos vários <em>tr’s</em> , com um <em>td</em> dentro, cuja classe é <em>pais</em>. É esse que nos interessa. Pois, aqui, vamos encontrar a colocação, e o nome do país.</p>
<p>O número de medalhas se encontra dentro de outros <em>td’s</em>, cuja classes são: <em>val_ouro</em>, <em>val_prata</em>, <em>val_bronze</em> e <em>val_tot</em> para medalhas de Ouro, Prata, Bronze e Totais, respectivamente.</p>
<h3>O código Ruby</h3>
<p>Primeiramente, vamos chamar as bibliotecas <a href="http://code.whytheluckystiff.net/hpricot/">Hpricot</a>, e Open-URI (para abrir uma página Web).</p>
<pre class="ruby"><code><span class="kw3">require</span> <span class="st0">'rubygems'</span>
<span class="kw3">require</span> <span class="st0">'hpricot'</span>
<span class="kw3">require</span> <span class="st0">'open-uri'</span></code></pre>
<p>Agora, vamos abrir a página que vamos fazer o parsing</p>
<pre class="ruby"><code>doc = Hpricot<span class="br0">(</span><span class="kw3">open</span><span class="br0">(</span><span class="st0">"http://agendapan.terra.com.br/br/medalhas/medalheiro.html"</span><span class="br0">)</span><span class="br0">)</span></code></pre>
<h3>Extraindo a colocação</h3>
<p>Vamos então, montar um código que passa por todos os <em>td’s</em> com a classe <em>pais</em>, e encontrar um link (<em>a</em>), que aponta para a <a href="http://agendapan.terra.com.br/br/medalhas/BRA/medalheiro_1.html">página específica de medalhas do Brasil</a>.</p>
<p>doc.search(&#8221;td.pais&#8221;).each do |pais|<br />
pais.search(&#8221;a[@href='/br/medalhas/BRA/medalheiro_1.html']&#8220;) do<br />
@colocacao = pais.inner_html[0..1].to_i<br />
end<br />
end</p>
<p>puts @colocacao</p>
<h3>As medalhas</h3>
<p>Após ter encontrado a colocação do Brasil, vamos exibir as medalhas ganhas até agora, encontrando o enésimo <em>tr</em> dentro de nossa tabela, usando a colocação como referência. Após isso, é só extrair o conteúdo dos <em>td’s</em> cuja classe sejam as das medalhas que procuramos.</p>
<pre class="ruby"><code>doc.<span class="me1">search</span><span class="br0">(</span><span class="st0">"table.tab_med"</span><span class="br0">)</span>.<span class="me1">at</span><span class="br0">(</span><span class="st0">"tr:nth-of-type(#{@colocacao})"</span><span class="br0">)</span> <span class="kw1">do</span> |medalhas|
  <span class="kw3">puts</span> <span class="st0">"Ouro: #{medalhas.search("</span>td.<span class="me1">val_ouro</span><span class="st0">").inner_html}"</span>
  <span class="kw3">puts</span> <span class="st0">"Prata: #{medalhas.search("</span>td.<span class="me1">val_prata</span><span class="st0">").inner_html}"</span>
  <span class="kw3">puts</span> <span class="st0">"Bronze: #{medalhas.search("</span>td.<span class="me1">val_bronze</span><span class="st0">").inner_html}"</span>
  <span class="kw3">puts</span> <span class="st0">"Total: #{medalhas.search("</span>td.<span class="me1">val_tot</span><span class="st0">").inner_html}"</span>
<span class="kw1">end</span></code></pre>
<h3>O código completo</h3>
<pre class="ruby"><code><span class="kw3">require</span> <span class="st0">'rubygems'</span>
<span class="kw3">require</span> <span class="st0">'hpricot'</span>
<span class="kw3">require</span> <span class="st0">'open-uri'</span>
 
doc = Hpricot<span class="br0">(</span><span class="kw3">open</span><span class="br0">(</span><span class="st0">"http://agendapan.terra.com.br/br/medalhas/medalheiro.html"</span><span class="br0">)</span><span class="br0">)</span>
 
doc.<span class="me1">search</span><span class="br0">(</span><span class="st0">"td.pais"</span><span class="br0">)</span>.<span class="me1">each</span> <span class="kw1">do</span> |pais|
  pais.<span class="me1">search</span><span class="br0">(</span><span class="st0">"a[@href='/br/medalhas/BRA/medalheiro_1.html']"</span><span class="br0">)</span> <span class="kw1">do</span>
    <span class="re1">@colocacao</span> = pais.<span class="me1">inner_html</span><span class="br0">[</span><span class="nu0">0</span>..<span class="nu0">1</span><span class="br0">]</span>.<span class="me1">to_i</span>
  <span class="kw1">end</span>
<span class="kw1">end</span>
 
<span class="kw3">puts</span> <span class="re1">@colocacao</span>
 
doc.<span class="me1">search</span><span class="br0">(</span><span class="st0">"table.tab_med"</span><span class="br0">)</span>.<span class="me1">at</span><span class="br0">(</span><span class="st0">"tr:nth-of-type(#{@colocacao})"</span><span class="br0">)</span> <span class="kw1">do</span> |medalhas|
  <span class="kw3">puts</span> <span class="st0">"Ouro: #{medalhas.search("</span>td.<span class="me1">val_ouro</span><span class="st0">").inner_html}"</span>
  <span class="kw3">puts</span> <span class="st0">"Prata: #{medalhas.search("</span>td.<span class="me1">val_prata</span><span class="st0">").inner_html}"</span>
  <span class="kw3">puts</span> <span class="st0">"Bronze: #{medalhas.search("</span>td.<span class="me1">val_bronze</span><span class="st0">").inner_html}"</span>
  <span class="kw3">puts</span> <span class="st0">"Total: #{medalhas.search("</span>td.<span class="me1">val_tot</span><span class="st0">").inner_html}"</span>
<span class="kw1">end</span></code></pre>
<p>Mais um problema resolvido, usando Ruby! :)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.arthurgeek.net/mostrando-a-colocao-do-brasil-no-pan-2007-usando-ruby/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>
