Nokogiri
Não sei se todo mundo já precisou disso mas provavelmente possa precisar. Surgiu um novo projeto para a nossa equipe no trabalho onde temos que criar um robô para ficar “lendo” um site de tempos em tempos. Isso pois havia uma pessoa que sempre ficava olhando o site e mandando email para avisar de algum eventual problema, isso merecia ser automatizado!
Lembrei que um tempo atras tive que fazer a mesma coisa em php, utilizei neste projeto o php simple html dom parser, um bom projeto mas como estamos utilizando ruby precisava de algo equivalente.
Então encontrei o Nokogiri que é um HTML, XML, SAX e Reader parser.
Vamos brincar um pouco com ele. Mas primeiro a instalação:
gem install nokogiri
Para termos um objetivo melhor vamos tentar pegar os títulos da primeira página deste blog.
require 'nokogiri'
require 'uri-open' # Este para ler a página por http
doc = Nokogiri::HTML(open("http://dynaum.com"))
doc.search("#articles//h1").each{ |title| puts title.children.inner_html }
Retorna:
Rails Iphone e Ipad
Restart
O método “search” aceita dois tipos de busca. Nos formatos de tag ou propriedades css e cada uma tem um método específico também.
XPATH
doc.xpath('//h1').each{ |t| puts t }
Isto nos retorna todos as tags h1:
<h1><a href="/">Elber Ribeiro</a></h1>
<h1><a href="/2010/06/29/rails-iphone-e-ipad/">Rails Iphone e Ipad</a></h1>
<h1><a href="/2010/02/16/restart/">Restart</a></h1>
<h1></h1>
CSS
doc.css('#archives').each{ |t| puts t }
Já o método css nos retorna os elementos que tem id “archives”:
<section id="archives">
<h1></h1>
<ul>
There are no articles for this date.
</ul>
</section>
O método “search” faz tudo junto como utilizado no primeiro exemplo.
Nokogiri não para por aí você pode substituir e criar elementos como desejar, para saber mais basta olhar estes tutoriais.
Com isso ficou bem mais fácil resolver o problema proposto para nós no trabalho.