From: "Jesús Gabriel y Galán" Date: 2010-05-01T21:49:46+09:00 Subject: Re: Reading lines from a file into an array On Sat, May 1, 2010 at 2:19 PM, Jim Burgess wrote: > Using ruby, I am trying to read in lines from a two column html table > and store each line in a two element array. This two element array is in > turn stored in one large array. > > The table rows look like this: > > >  Row 1 - Column 1 >  Row 1 - Column 2 > > ... > > And, when I'm done, I hoping for this: > [["row1 - col1", "row1, col2"], ["row2 - col1", "row2, col2"], ...] > > Can anyone give me any pointers on the correct way to do this. > The code I have come up with so far is this: > > f = File.open("file_containing_table.txt", "r") > lines = f.readlines > array_to_hold_rows= [] > index = 0 > loop do >  if lines[index] == nil >    break >  elsif lines[index].match "    array_to_hold_rows << ["#{lines[index]}", "#{lines[index+1]}"] >    index +=2 >  else >    index +=1 >  end > end Usually parsing html with regular expressions is risky. I'd use a parser instead, if possible, for example nokogiri: require 'nokogiri' html =<
Row 1 - Column 1 Row 1 - Column 2
Row2 - col1 row2 - col2
END doc = Nokogiri::HTML(html) result = [] doc.xpath('//tr[@class="odd"]/td').each_slice(2) do |first, second| result << [first.inner_html, second.inner_html] end result #=> [["Row 1 - Column 1", "Row 1 - Column 2"], [" Row2 - col1", " row2 - col2"]] > This works and does what I want, but I would like to know if this is the > best / most effective way to go about what I am trying to achieve. I think in your solution you are not stripping the markup, so your array still contains the and tags. Now that I think about it you might want to tweak the Xpath I wrote, because maybe not all the trs have class="odd". Hope this helps, Jesus.