Feed építés HTML-ből [update]

2008-02-03 16:32 | kommentek

Longhand Domain szemle bejegyzését olvasva merült fel bennem a gondolat, hogy milyen jó lenne a várólistán levő domaineket egy RSS feedben követni. Léteznek olyan online eszközök, amelyekkel ezt könnyen meg lehet oldani, én többek között a feed43-val próbálkoztam. Sajnos nem hozta azt, amit vártam tőle, ezért úgy döntöttem, hogy egy kis Ruby szkripttel oldom meg a feladatot.

Amúgy az egészről longhand már írt, én a továbbiakban pár szóban leírom, hogy milyen eszközökkel készült a dolog.

Update

Két dolog történt. Átvittem a feedeket FeedBurner-re, és a lejáró domainekhez hozzáadtam egy PageRank sort is. Mivel a lejáró domainek általában olyanok, amik már senkit sem érdekelnek, ezért ez legtöbb esetben nem elérhető érték, vagy 0, de előfordul egy-két normális PageRankkel rendelkező domain is.

Várólista:

Lejáró domainek:

Technikai részletek

A html forrás feldolgozásához egy már korábbi bejegyzésben bemutatott hpricot gemet használtam fel. Ezzel gyerekjáték kiszedni a legkuszább html oldalból is az általunk érdekesnek ítélt részeket.

doc = Hpricot(open('http://www.domain.hu/domain/varolista/ido.html'))
conv = Iconv.new('utf-8', 'iso-8859-2')

items = []
doc.at("table[@border=1]").search("tr") do |tr|
  num, domain, claimant, date = (tr / "td").map {|t| conv.iconv(t.to_plain_text)}
  more = (tr % "td a" or {})['href']
  if num =~ /^\d+$/ and more
    items << {
      :domain => domain,
      :claimant => claimant,
      :date => Chronic.parse(date),
      :more => URI.encode('http://www.domain.hu/domain/varolista/'+more)}
  end
  break if items.size >= 300
end

A szükséges adatok összegyűjtése után az RSS formába öntés még ennél is egyszerűbb feladat volt. Ehhez az rss/maker Standard Ruby Library volt segítségemre.

content = RSS::Maker.make('2.0') do |m|
  m.channel.title = ".hu domain regisztrációs várólista"
  m.channel.link = "http://www.domain.hu/domain/varolista/ido.html"
  m.channel.description = "kéthetes .hu domain regisztrációs várólista legfrisebb elemei"
  m.items.do_sort = true

  items.each do |item|
    i = m.items.new_item
    i.title = item[:domain]
    i.link = item[:more]
    i.date = item[:date]
    i.description = item[:claimant]
  end
end