#!/bin/sh # # Beispiel zum Auslesen von Webseiten # # \ exec tclsh $0 $@ package require http package require dom # # Herunterladen der Seite # set url "http://www.bsh.de/aktdat/wvd/StPauli_pgl.htm" # timeout ist in Millisekunden set abfrageID [::http::geturl $url -timeout 10000 ] if [ string match ok [http::status $abfrageID] ] { set inhalt [::http::data $abfrageID ] ::http::cleanup $abfrageID } else { puts stderr "Laden der Seite $url fehlgeschlagen" puts stderr [ http::status $abfrageID ][http::error $abfrageID] ::http::cleanup $abfrageID exit 1 } # # Auslesen der Messwerte # # Löschen des überflüssigen elements set zeilen [ split $inhalt \n] set out [ open pegel.html w] foreach zeile $zeilen { if [regexp {^} $zeile] { puts stderr "Lösche $zeile" } else { puts $out $zeile } } # Aufrufen von tidy zum Umwandeln in # sauberes XML if [catch {exec tidy -utf8 -i -o sauber.xml -asxhtml pegel.html } res] { #puts $res } # Einlesen in DOM set fd [ open sauber.xml ] set inhalt [ read $fd] close $fd set doc [ dom::parse $inhalt] # Tabelle mit Pegelständen findet sich unter dem XPath # html/body/table/tr[5]/td/table/tr/td[2]/table/tr/td/table/tr[3]/td[2]/table[5] # # entspricht html/body/table/tr[5] set trs [ dom::selectNode $doc //html/body/table/tr] set tr [ lindex $trs 4] # entspricht html/body/table/tr[5]/td/table/tr/td[2] set tds [ dom::selectNode $tr td/table/tr/td] set td [ lindex $tds 1] # entspricht html/body/table/tr[5]/td/table/tr/td[2]/table/tr/td/table/tr[3] set trs [ dom::selectNode $td table/tr/td/table/tr ] set tr [lindex $trs 2] # entspricht html/body/table/tr[5]/td/table/tr/td[2]/table/tr/td/table/tr[3]/td[2] set tds [ dom::selectNode $tr td] set td [ lindex $tds 1] # entspricht html/body/table/tr[5]/td/table/tr/td[2]/table/tr/td/table/tr[3]/td[2]/table[5] set tables [ dom::selectNode $td table] set table [ lindex $tables 4] # # Abspeichern in CSV # set fd [ open pegelstand.csv w] puts $fd "# Tag; Monat; Zeit; Pegelnull; Seekartennull" foreach zeile [ lrange [ dom::selectNode $table tr ] 2 end ] { foreach zelle [ dom::node children $zeile ] { switch [dom::node cget $zelle -nodeName] { th - td { set text [string trim [dom::node stringValue $zelle]] puts -nonewline $fd "$text;" } default { # andere Knoten ignorieren } } } puts $fd "" } close $fd