1

このサンプルテーブルデータがあります...

<table class="main">
  <tr class="main">
    <td align="left">3/4/05</td>
    <td>123-334</td>
    <td></td>
    <td></td>
    <td></td>
    <td align="right">$2.00</td>
  </tr>
  <tr style="background-color:#FFFFD7">
    <td colspan="2">Company Name</td>
    <td colspan="4">Owner Name</td>
  </tr>
   .....
  This goes on like this with every other <tr> holding 
  information that I need together.
   ......
</table>

私はこのコードを書きましたが、すべてではなく最初のコードを取得しているだけです...

data_table = Nokogiri::HTML(page_body, 'UTF-8')
FasterCSV.open('data.csv', 'a') do |csv|

  table = data_table.xpath('//table[@class="main"]')
  rows = table.xpath('tr')
  rows.collect do |row|
    date = row.at_xpath('tr[@class="main"]/td[1]/text()')
    id = row.at_xpath('tr[@class="main"]/td[2]/text()')
    amount = row.at_xpath('tr[@class="main"]/td[3]/text()')
    company = row.at_xpath('tr[@style="background-color:#FFFFD7"]/td[1]/text()')
    name = row.at_xpath('tr[@style="background-color:#FFFFD7"]/td[2]/text()')
    csv << [date, id, amount, company, name]
   end
  end

これら 2 つ<tr>の を CSV ファイルの 1 つの行に入れる方法についてのアイデアはありますか? テーブル全体からすべてのデータを取得しますか?

4

1 に答える 1

3

テーブルのすべての「trs」をeach_slice(2)取得してから、関連する行のペアを取得するために使用できます。

html = %q{
<table class="main">
  <tr class="main">
    <td align="left">3/4/05</td>
    <td>123-334</td>
    <td></td>
    <td></td>
    <td></td>
    <td align="right">$2.00</td>
  </tr>
  <tr style="background-color:#FFFFD7">
    <td colspan="2">Company Name</td>
    <td colspan="4">Owner Name</td>
  </tr>
  <tr class="main">
    <td align="left">2/4/05</td>
    <td>223-334</td>
    <td></td>
    <td></td>
    <td></td>
    <td align="right">$4.00</td>
  </tr>
  <tr style="background-color:#FFFFD7">
    <td colspan="2">Company Name2</td>
    <td colspan="4">Owner Name2</td>
  </tr>  
</table>}

data_table = Nokogiri::HTML(html)
table = data_table.xpath('//table[@class="main"]')
rows = table.xpath('tr')
rows.each_slice(2) do |row_pair|
    date = row_pair[0].at_xpath('./td[1]').text
    id = row_pair[0].at_xpath('./td[2]').text
    amount = row_pair[0].at_xpath('./td[6]').text
    company = row_pair[1].at_xpath('./td[1]').text
    name = row_pair[1].at_xpath('./td[2]').text
    p [date, id, amount, company, name]
end

これにより、必要な配列が得られます(csvに入れることができます):

["3/4/05", "123-334", "$2.00", "Company Name", "Owner Name"]
["2/4/05", "223-334", "$4.00", "Company Name2", "Owner Name2"]
于 2013-04-12T16:36:33.510 に答える