B. Maffettone wrote:
ma sarebbe mia intenzione leggere direttamente i valori contenuti nelle
tabelle.
Ciao,
posto qui la soluzione visto che potrebbe essere di aiuto anche a altri:
################# CODICE ################################
#!/usr/bin/ruby
require ‘rubygems’
require ‘hpricot’
doc = open(‘abc.htm’) {|f| Hpricot(f, :xhtml_strict => true)}
Questa e’ la lista che conterra’ le nostre tabelle
tabelle = Array.new
(doc/‘table’).each do |table|
Una tabella e’ un’array di righe, dove ogni riga a sua volta
sara’ un array
tabella = Array.new
Scorro le righe
(table/‘tr’).each do |tr|
# Creo un’array per l’ultima riga
tabella << Array.new
# ora scorro gli elementi della riga
(tr/‘td’).each do |td|
# Ora devo eseguire un po’ di controlli sul contenuto di
.
# | puo’ infatti contenere:
# 1. un numero (lo possiamo prendere cosi’ com’e’
# 2. un numero dentro i il tag o (dobbiamo quindi
rimuovere il tag)
# 3. del testo (per esempio: ‘Emesso’, ‘Annullato’, ecc. Questo
non ci interessa)
# Per prima cosa rimuovo un eventuale <b> o <i>
value = td.inner_html
if(!td.at('b|i').nil?)
value = td.at('b|i').inner_html
end
# Ora verifico se value contiente un valore
number = nil
if(value.strip =~ /^\d+(,\d+)?$/)
# la regular expression seleziona i valori numerici, i quali
sono formati da:
# - una o piu’ cifre: \d+
# - opzionalmente possono avere una virgola e una o piu’ cifre
dopo di essa: (,\d+)?
# Converto la stringa in un float
number = value.to_f
end
# Aggiungo il numero alla tabella solo se non e’ nil
tabella.last << number unless number.nil?
end
# rimuovo l'ultima riga, se la riga e' completamente vuota
tabella.pop if tabella.last.empty?
end
aggiungo la tabella alla lista di tabelle
tabelle << tabella
end
tabelle.each do |tabella|
tabella.each do |riga|
puts riga.join("\t")
end
puts
end
################# CODICE ################################
Purtroppo il codice html che mi hai spedito, che allego a questa email
per completezza, e’ mal formato. Guarda, per esempio la la cella: “1878,46
| ”
invece di chiudere la riga, non c’e’ il tag di chiusura ma ne inizia
subito un’altra:
“
1878,46 | Terminale 18 |
”
Questo crea un po’ di problemi ad Hpricot. Se correggi l’errore, lo
script che ti ho postato funziona senza problemi.
ciao!
Gendag