A Beer Atom Feed

Posted by hank, Fri Oct 12 23:10:00 UTC 2007

So, after reviewing over 50 beers on BeerAdvocate, I’ve come to the conclusion that them not having an RSS or Atom feed of my most recent reviews available is stupid. So, I decided to make my own by scraping their HTML today. I started off by pumping some random code into irb that included Hpricot and Builder. Ruby rocks for doing stuff like this. Anyway, I ended up with this at the end:

require 'rubygems'
require 'hpricot'
require 'open-uri' 
require 'builder'

# Get the document to scrape
doc = Hpricot(open("http://beeradvocate.com/user/beer_reviews?user=ralree"))
trs = (doc/"table")[2].search("tr")

# Create the feed
target = File.new("beer.xml", "w")
xml = Builder::XmlMarkup.new(:target => target, :indent => 1)
xml.instruct!
xml.feed "xmlns" => "http://www.w3.org/2005/Atom" do
  xml.id "http://www.ralree.info/beer.xml"
  xml.title "ralree the BeerAdvocate"
  xml.subtitle "Recent Beer Reviews"
  xml.link  "rel" => "self", "href" => "http://www.ralree.info/beer.xml"
  xml.updated Time.now.iso8601
  xml.author  { xml.name "Erik Gregg"; xml.email "ralree@gmail.com" }

  # For each TR, make an entry
  trs.each do |a|
    tds = a.search("td").to_a
    if tds.length == 7
    xml.entry do
        xml.updated(Time.parse(tds[0].inner_html.gsub('-', '/')).iso8601)
        xml.title((tds[1]/"a/b").inner_html)
        xml.link(:href => 
          ("http://www.beeradvocate.com" + ((tds[1]/"a")[0]["href"]))) do |x|
          xml.text!((tds[1]/"a/b")[0].inner_html)
        end
        xml.summary do |p|
          p.cdata! <<EOOMFG
Brewery: #{(tds[2]/"a")[0].inner_html}
Style: #{(tds[3]/"a")[0].inner_html}
Serving: #{tds[4].inner_html}
ABV: #{tds[5].inner_html}
Rating: #{(tds[6]/"b").inner_html}
EOOMFG
        end
      end
    end
  end
end

This produces the feed that you can find here. Feel free to add it to your aggregator, and you’ll be notified whenever I review a beer! This is what it looks like:

ZOMG BEER!

Get the codez here

Tags:

Comments

Have your say

A name is required. You may use Markdown in your comments.