# Using hpricot to get tables

**URL:** <https://www.ruby-forum.com/t/using-hpricot-to-get-tables/141924>\
**Category:** Ruby\
**Created:** [July 1, 2008, 8:10pm UTC](https://www.ruby-forum.com/t/using-hpricot-to-get-tables/141924 "2008-07-01T20:10:55Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![casper\_the\_ghost](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/58956e/32.png) [@casper\_the\_ghost](https://www.ruby-forum.com/u/casper_the_ghost)\
**Post date:** [July 1, 2008, 8:10pm UTC](https://www.ruby-forum.com/t/using-hpricot-to-get-tables/141924/1 "2008-07-01T20:10:55Z")

</div>

I am working with the following script to parse a page

require ‘hpricot’  
require ‘open-uri’

strLink =“[http://www.sportsline.com/mlb/gamecenter/boxscore/](http://www.sportsline.com/mlb/gamecenter/boxscore/)  
MLB\_20080331\_ARI@CIN”  
strPath =“div[@class=SLTables1]/div”

@doc = Hpricot(open(strLink))

@doc.search(strPath) do |div|  
puts div.inner\_html

# puts div.css\_path

# puts div.xpath

# puts

puts  
end

This prints 4 tables to the screen

 blah, blah, blah 

 blah, blah, blah 

 blah, blah, blah 

 blah, blah, blah 

I would like to access each table individually. How can I do that?

Thanks,

Luis

---

<div class="post-metadata">

**Author:** ![casper\_the\_ghost](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/58956e/32.png) [@casper\_the\_ghost](https://www.ruby-forum.com/u/casper_the_ghost)\
**Post date:** [July 1, 2008, 11:07pm UTC](https://www.ruby-forum.com/t/using-hpricot-to-get-tables/141924/2 "2008-07-01T23:07:33Z")

</div>

> I would like to access each table individually

doc.search returns an array even if there is only one match. The  
consturct you are using iterates through this array:

doc.search(strPath) do |div|

end

if you capture the search results into a variable named “divs” you can  
index it like and array (because it is one)

divs=doc.search(strPath)

If you want to immediately start iterating you can do this:

doc.search(strPath).each\_with\_index do |div,idiv|  
puts idiv if idiv==2  
end

I work with hpricot a lot and I find it is more productive to not use  
all the fancy ruby idioms to shorten your code as you are dealing with  
pages that are very fragile to parse when someone changes the page  
content.

# See code below

require ‘hpricot’  
require ‘open-uri’

strLink  
=“[http://www.sportsline.com/mlb/gamecenter/boxscore/MLB\_20080331\_ARI@CIN](http://www.sportsline.com/mlb/gamecenter/boxscore/MLB_20080331_ARI@CIN)”  
strPath =“//div[@class=‘SLTables1’]/div”

doc = Hpricot(open(strLink))  
divs=doc.search(strPath)

puts “#{divs[0].inner\_text.slice(0…70)}\n\n”  
puts “#{divs[1].inner\_text.slice(0…70)}\n\n”  
puts “#{divs[2].inner\_text.slice(0…70)}\n\n”  
puts “#{divs[3].inner\_text.slice(0…70)}\n\n”

---

<div class="post-metadata">

**Author:** ![casper\_the\_ghost](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/58956e/32.png) [@casper\_the\_ghost](https://www.ruby-forum.com/u/casper_the_ghost)\
**Post date:** [July 1, 2008, 11:45pm UTC](https://www.ruby-forum.com/t/using-hpricot-to-get-tables/141924/3 "2008-07-01T23:45:02Z")

</div>

On Jul 1, 4:03 pm, Dan D. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> if you capture the search results into a variable named “divs” you can index it like and array (because it is one)
> 
> puts “#{divs[0].inner\_text.slice(0…70)}\n\n”  
> puts “#{divs[1].inner\_text.slice(0…70)}\n\n”  
> puts “#{divs[2].inner\_text.slice(0…70)}\n\n”  
> puts “#{divs[3].inner\_text.slice(0…70)}\n\n”

This works. Will be very useful for future projects.

I ended up using the xpath for each table which also worked.

Thanks,

Luis
