# Hpricot

**URL:** <https://www.ruby-forum.com/t/hpricot/73008>\
**Category:** IT\
**Created:** [October 20, 2006, 4:14pm UTC](https://www.ruby-forum.com/t/hpricot/73008 "2006-10-20T16:14:28Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![BSMaffettone](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/b/e68b1a/32.png) [@BSMaffettone](https://www.ruby-forum.com/u/BSMaffettone)\
**Post date:** [October 20, 2006, 4:14pm UTC](https://www.ruby-forum.com/t/hpricot/73008/1 "2006-10-20T16:14:28Z")

</div>

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/](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.

---

<div class="post-metadata">

**Author:** ![BSMaffettone](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/b/e68b1a/32.png) [@BSMaffettone](https://www.ruby-forum.com/u/BSMaffettone)\
**Post date:** [October 21, 2006, 1:53am UTC](https://www.ruby-forum.com/t/hpricot/73008/2 "2006-10-21T01:53:59Z")

</div>

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 🙂

> Grazie in ogni caso.

ciao!

Gendag

---

<div class="post-metadata">

**Author:** ![BSMaffettone](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/b/e68b1a/32.png) [@BSMaffettone](https://www.ruby-forum.com/u/BSMaffettone)\
**Post date:** [October 21, 2006, 9:20am UTC](https://www.ruby-forum.com/t/hpricot/73008/3 "2006-10-21T09:20:51Z")

</div>

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 🙂
> 
> > 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

---

<div class="post-metadata">

**Author:** ![BSMaffettone](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/b/e68b1a/32.png) [@BSMaffettone](https://www.ruby-forum.com/u/BSMaffettone)\
**Post date:** [October 21, 2006, 10:58am UTC](https://www.ruby-forum.com/t/hpricot/73008/4 "2006-10-21T10:58:25Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![BSMaffettone](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/b/e68b1a/32.png) [@BSMaffettone](https://www.ruby-forum.com/u/BSMaffettone)\
**Post date:** [October 24, 2006, 2:54pm UTC](https://www.ruby-forum.com/t/hpricot/73008/5 "2006-10-24T14:54:20Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![BSMaffettone](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/b/e68b1a/32.png) [@BSMaffettone](https://www.ruby-forum.com/u/BSMaffettone)\
**Post date:** [October 24, 2006, 5:50pm UTC](https://www.ruby-forum.com/t/hpricot/73008/6 "2006-10-24T17:50:36Z")

</div>

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](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](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](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

---

<div class="post-metadata">

**Author:** ![BSMaffettone](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/b/e68b1a/32.png) [@BSMaffettone](https://www.ruby-forum.com/u/BSMaffettone)\
**Post date:** [October 24, 2006, 5:11pm UTC](https://www.ruby-forum.com/t/hpricot/73008/7 "2006-10-24T17:11:18Z")

</div>

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
