Filmnächte-Scraping: Unterschied zwischen den Versionen

Aus C3D2
Zur Navigation springen Zur Suche springen
(This page must use the Rübÿ Spëëd Mëtäl Cödïng template!!!111)
(Astro und ich(hab den kleinsten Anteil) haben das Script noch etwas abgeaendert.)
Zeile 37: Zeile 37:
   }.to_s.strip + (ptsd ? " (#{ptsd.strip})" : "")
   }.to_s.strip + (ptsd ? " (#{ptsd.strip})" : "")
}</pre>
}</pre>
[[Kategorie:Ruby]]


Nachdem [[Benutzer:Conny|mir]] Astro sehr viel geholfen hat, ist dann folgendes Script herausgekommen.
Das Script holt sich bei jedem Aufruf automagisch die Daten von der Website, verarbeitet sie und gibt die Daten wieder als xml-file (filmnaechte.xml) aus. Dieses ist dann so vorbereitet, das es "hoffentlich" als RSS-Feed benutzt werden kann.
<pre>
#!/usr/bin/env ruby
require 'htree'
require 'http-access2'
require 'time'
require 'rexml/element'
class Event
    attr_reader  :time
          def <=>(o)
                @time <=> o.time
          end
    def initialize(spans)
if spans['progDay'] =~ /(\d+)\. (.+)/
tag, monatsname = $1, $2
monat = case monatsname
when 'Juli' then 7
when 'August' then 8
when 'September' then 9
else
raise "Unbekannter Monat: #{monatsname}"
end
elsif spans['progDay'] =~ /Heute/
    tag, monat = Time.now.day, Time.now.month
else
raise "Komischer Tag: #{spans['progDay']}"
end
if spans['progTime'] =~ /(\d+)[:\.](\d+)/
    stunde, minute = $1, $2
end
  @time = Time.local(2006, monat, tag, stunde, minute)
  @title = spans['progTitle']
  @description = spans['progTitleSpecialDay'].to_s
    end
    def to_rss
  # Beispiel-RSS: http://astroblog.spaceboyz.net/rss.rb :-)
  item = REXML::Element.new('item')
  title = item.add(REXML::Element.new('title'))
  title.text = @title
  pubDate = item.add(REXML::Element.new('pubDate'))
  pubDate.text = @time.strftime('%Y-%m-%dT%H:%M:%S+02:00')   # Immer Sommerzeit (GMT+2)
  description = item.add(REXML::Element.new('description'))
  description.text = @description
  item
    end
end
#quelle
urlstr = 'http://filmnaechte-am-elbufer.de/fn.php?idx=20'
#html-inhalt holen
    programm_html = ''
    h = HTTPAccess2::Client.new(urlstr)
    response = h.get(urlstr){ |data| programm_html += data }
#html-Daten verarbeiten
    doc = HTree(programm_html).to_rexml
    events = []
    spans = {}
    doc.each_element('/html/body//table[@style=\'width: 488px\']/tr/td//span') { |span|
      text = span.text.to_s
      text.gsub!(/\&nbsp./, ' ')
      spans[span.attributes['class']] = text if text.size > 0
      if span.attributes['class'] == 'progTitle'
      events << Event.new(spans)
      spans = { 'progDay'=>spans['progDay'],
                'progTime'=>spans['progTime'],
                'progWeek'=>spans['progWeek'] }
      end
    }
#xml-file erzeugen
f = File.new("filmnaechte.xml", "w")
#xml und rss Header erzeugen
f.write('<?xml version="2.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
<title>Filmnaechte am Elbufer</title>
<link>http://filmnaechte-am-elbufer.de/</link>
<description>Filmnaechte am Elbufer</description>
<language>de-de</language>')
  events.sort!
  while events.first.time < Time.now
events.shift
  end
    events = events[0..9]
    events.each { |event|
    event.to_rss.write(f)
#Um den xml-code besser lesbar zu machen, wird noch ein Zeilenumbruch eingefuegt.
f.write("\n")
    }
f.write('</channel>'"\n"'</rss>')
f.close
</pre>


[[Kategorie:Ruby]]


{{Rübÿ Spëëd Mëtäl Cödïng}}
{{Rübÿ Spëëd Mëtäl Cödïng}}

Version vom 19. Juli 2006, 18:01 Uhr

Bald sind wieder, ganz hipp, Filmnächte am Elbufer. Leider ist auf http://filmnaechte-am-elbufer.de/ keine sofort verwertbare Information zu finden.

require 'htree'
#
# Saugen
#
#system("wget -O programm.html 'http://filmnaechte-am-elbufer.de/fn.php?idx=20'")
#
# Parsen
#
doc = HTree(File.new('programm.html')).to_rexml
events = []
spans = {}
doc.each_element('/html/body//table[@style=\'width: 488px\']/tr/td//span') { |span|
  text = span.text.to_s
  text.gsub!(/\&nbsp./, ' ')
  spans[span.attributes['class']] = text if text.size > 0
  if span.attributes['class'] == 'progTitle'
    events << spans
    spans = {'progDay'=>spans['progDay'],
             'progTime'=>spans['progTime'],
             'progWeek'=>spans['progWeek']}
  end
}
#
# Ausgabe tabellarisch
#
column_sizes = Hash.new(0)
events.each { |event|
  event.each { |column,cell|
    column_sizes[column] = cell.size if cell.size > column_sizes[column]
  }
}
events.each { |event|
  ptsd = event['progTitleSpecialDay']
  puts %w(progWeek progDay progTime progTitle).collect { |column|
    event[column].ljust(column_sizes[column] + 2)
  }.to_s.strip + (ptsd ? " (#{ptsd.strip})" : "")
}

Nachdem mir Astro sehr viel geholfen hat, ist dann folgendes Script herausgekommen. Das Script holt sich bei jedem Aufruf automagisch die Daten von der Website, verarbeitet sie und gibt die Daten wieder als xml-file (filmnaechte.xml) aus. Dieses ist dann so vorbereitet, das es "hoffentlich" als RSS-Feed benutzt werden kann.

#!/usr/bin/env ruby
require 'htree'
require 'http-access2'
require 'time'
require 'rexml/element'


class Event
    attr_reader  :time
          def <=>(o)
                @time <=> o.time
          end
    def initialize(spans)
	if spans['progDay'] =~ /(\d+)\. (.+)/
		tag, monatsname = $1, $2
		monat = case monatsname
			when 'Juli' then 7
			when 'August' then 8
			when 'September' then 9
		else
			raise "Unbekannter Monat: #{monatsname}"
		end

	elsif spans['progDay'] =~ /Heute/
	    tag, monat = Time.now.day, Time.now.month
	else
		raise "Komischer Tag: #{spans['progDay']}"
	end

	if spans['progTime'] =~ /(\d+)[:\.](\d+)/
	    stunde, minute = $1, $2
	end

	  @time = Time.local(2006, monat, tag, stunde, minute)
	  @title = spans['progTitle']
	  @description = spans['progTitleSpecialDay'].to_s
    end

    def to_rss
	  # Beispiel-RSS: http://astroblog.spaceboyz.net/rss.rb :-)
	  item = REXML::Element.new('item')
	  title = item.add(REXML::Element.new('title'))
	  title.text = @title
	  pubDate = item.add(REXML::Element.new('pubDate'))
	  pubDate.text = @time.strftime('%Y-%m-%dT%H:%M:%S+02:00')	  # Immer Sommerzeit (GMT+2)
	  description = item.add(REXML::Element.new('description'))
	  description.text = @description
	  item
    end
end

#quelle
urlstr = 'http://filmnaechte-am-elbufer.de/fn.php?idx=20'

#html-inhalt holen

    programm_html = ''
    h = HTTPAccess2::Client.new(urlstr)
    response = h.get(urlstr){ |data| programm_html += data }

#html-Daten verarbeiten
    doc = HTree(programm_html).to_rexml
    events = []
    spans = {}

    doc.each_element('/html/body//table[@style=\'width: 488px\']/tr/td//span') { |span|
       text = span.text.to_s
       text.gsub!(/\&nbsp./, ' ')
       spans[span.attributes['class']] = text if text.size > 0

       if span.attributes['class'] == 'progTitle'
       events << Event.new(spans)
       spans = { 'progDay'=>spans['progDay'],
                 'progTime'=>spans['progTime'],
                 'progWeek'=>spans['progWeek'] }
       end
    }

#xml-file erzeugen
f = File.new("filmnaechte.xml", "w")

#xml und rss Header erzeugen
 f.write('<?xml version="2.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
<title>Filmnaechte am Elbufer</title>
<link>http://filmnaechte-am-elbufer.de/</link>
<description>Filmnaechte am Elbufer</description>
<language>de-de</language>')

	  events.sort!
	  while events.first.time < Time.now
		events.shift
	  end

    events = events[0..9]
    events.each { |event|
    event.to_rss.write(f)

#Um den xml-code besser lesbar zu machen, wird noch ein Zeilenumbruch eingefuegt.
 f.write("\n")

    }
 f.write('</channel>'"\n"'</rss>')
f.close
Rübÿ Spëëd Mëtäl Cödïng
Coders: Astro | Conny | Sven