2013-04-12 71 views
1

我有這個樣表數據採集數據......使用引入nokogiri從交替行

<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 

關於如何在CSV文件中將這兩個<tr>合併爲一行的任何想法?並從整個表中獲取所有數據?

回答

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"] 
+0

這是工作,但我忘了補充一點,我有標題的第一行,我認爲是搞砸了數據......我怎麼跳過第一個?比你多。 – user1563849

+2

您可以在'rows'變量上使用drop(1)來刪除第一行。因此,將'rows.each_slice(2)'改爲'rows.drop(1).each_slice(2)'。 –

+0

完美!謝謝!! – user1563849