Hpricot

Ciao.
Da un file html ho bisogno di leggere dei dati che sono contenuti in
alcune tabelle ivi contenute.
Ho installato Hpricot e da
http://code.whytheluckystiff.net/hpricot/
ho letto qualche esempio ma per ora sono riuscito solo a eliminare dei
tag con
per esempio
doc = Hpricot(open(“C:\k1\ese.htm”))

(doc/“script”).search

(doc/“div/table/tr/td/b”).remove
#(doc/“div/table/td/tr”).remove

print risultato

ma sarebbe mia intenzione leggere direttamente i valori contenuti nelle
tabelle.
Potete dirmi dove trovare documentazione più esplicativa riguardo
Hpricot ?
Uso ruby da poco tempo (ho iniziato con rails).
Per essere più chiaro potrei mandare un esempio dell’html.
Grazie in ogni caso.

B. Maffettone wrote:

(doc/“div/table/tr/td/b”).remove
#(doc/“div/table/td/tr”).remove

print risultato

ma sarebbe mia intenzione leggere direttamente i valori contenuti nelle
tabelle.

Anche io ho iniziato da poco a utilizzare Hpricot. Cmq per leggere i
dati da una cella ti una tabella, per prima cosa devi individuare la
cella e poi estrai il suo contenuto usando il metodo inner_html().
Per esempio per leggere una tabella scorrendola per righe, puoi fare:

scorri la tabella per righe

(doc/“div/table/tr”).each {|tr|

scorri ogni riga per colonne

(tr/“td”).each {|td|
# stampi il valore contenuto nella cella.
puts td.inner_html
}
}

Potete dirmi dove trovare documentazione più esplicativa riguardo
Hpricot ?

La sto cercando anche io, quella del sito ufficiale mi sembra un
po’ pochina.

Uso ruby da poco tempo (ho iniziato con rails).
Per essere più chiaro potrei mandare un esempio dell’html.

Potrebbe essere una buona idea :slight_smile:

Grazie in ogni caso.

ciao!

Gendag

Gendag wrote:

Uso ruby da poco tempo (ho iniziato con rails).
Per essere più chiaro potrei mandare un esempio dell’html.

Potrebbe essere una buona idea :slight_smile:

Grazie in ogni caso.

Al momento per risolvere ho usato il seguente codice per
generare un file testo da cui poi fare un input riga per riga:

require ‘rubyful_soup’
input = IO.read(“c:\k1\ese.htm”)
soup = BeautifulSoup.new(input)
fh = File.new(“c:\k1\temp.txt”, “w”)
fh.print soup.prettify()
fh.close

Ho tentato di mandare in attachment l’esempio di html (sia zippato che
non) da processare ma ottengo
errore Application error (Rails)
dimmi come posso mandartelo.
Grazie per la disponibilitÃ
Ciao
BM

B. Maffettone wrote:

Ho tentato di mandare in attachment l’esempio di html (sia zippato che

Spediscimelo a
thegendag
CHIOCCIOLA
libero
PUNTO
it

ciao!

Gendag

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,46Terminale 18

Questo crea un po’ di problemi ad Hpricot. Se correggi l’errore, lo
script che ti ho postato funziona senza problemi.

ciao!

Gendag

B. Maffettone wrote:

Grazie per la risposta. Non mi aspettavo una soluzione ad hoc sei troppo
cortese.

Non ti preoccupare, e’ stato un buon allenamento anche per me.

Ora mi guarderò il codice ma ti chiedo da subito qualche link
per documentazione ulteriore (adesso o in futuro) su Hpricot o tecniche
di parser in genere.

Purtroppo non ho molto link su Hpricot, ho iniziato a studiarlo circa
due settimane fa e l’unica documentazione che conosco e’ quella sul sito
ufficiale
(http://code.whytheluckystiff.net/hpricot/wiki/AnHpricotShowcase), che
comunque considero molto scarna.
L’unico link che posso segnalarti e il link ad un esempio di uso di
Hpricot:
http://shanesbrain.net/articles/2006/10/02/screen-scraping-wikipedia
Il programma fa lo ‘scraping’ di una pagina della wekipedia. Puo’ essere
d’aiuto come esempio all’utilizzo di Hpricot.

Come metodo brutale per conoscere i metodi di un dato oggetto Hpricot ho
usato anche il metodo .methods() che ti restituisce una lista dei metodi
pubblici dell’oggetto… non e’ un granche’ come soluzione, anche
perche’ dopo bisogna un po’ provare i metodi alla cieca in base al loro
nome.

Già questo (f, :xhtml_strict => true) lo devo decifrare.

Questo lo trovi nella pagina di documentazione del sito
ufficiale(http://code.whytheluckystiff.net/hpricot/wiki/HpricotFixups)/
A detta della documentazione: “The :xhtml_strict option really tries to
force the document to be an XHTML 1.0 Strict document.”. L’ho messa
nella speranza che Hpricot riuscisse da solo a risolvere il problema del
file HTML, ma non ha funzionato.

Purtroppo mi arriva così, altri modelli sono ancora peggio e in futuro
non ho garanzie che saranno ben formati.

ouch.

Si può pensare di processarli per correggerne gli errori ?

Sinceramente non lo so, dovresti provare a guardare in giro se esistono
delle librerie/tool che fanno cio’. Io purtroppo non li conosco.
C’e’ da dire che non sono molto esperto in campo, quindi hai buone
speranze di trovare qualcosa.

Grazie ancora per la disponibilitÃ
figurati!

Ciao!

Gendag

Grazie per la risposta. Non mi aspettavo una soluzione ad hoc sei troppo
cortese. Ora mi guarderò il codice ma ti chiedo da subito qualche link
per documentazione ulteriore (adesso o in futuro) su Hpricot o tecniche
di parser in genere.
Già questo (f, :xhtml_strict => true) lo devo decifrare.

Purtroppo il codice html che mi hai spedito, che allego a questa email
per completezza, e’ mal formato.

Purtroppo mi arriva così, altri modelli sono ancora peggio e in futuro
non ho garanzie che saranno ben formati.

Si può pensare di processarli per correggerne gli errori ?

Grazie ancora per la disponibilitÃ

Ciao
BM