【问题标题】:Using Nokogiri collect data from alternating rows使用 Nokogiri 从交替行收集数据
【发布时间】:2013-04-12 14:03:40
【问题描述】:

我有这个示例表数据...

<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

关于如何将这两个&lt;tr&gt; 放在我的 CSV 文件中的一行中的任何想法?并从整个表中获取所有数据?

【问题讨论】:

    标签: ruby nokogiri mechanize


    【解决方案1】:

    您可以获取表的所有“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"]
    

    【讨论】:

    • 这行得通,但我忘了补充说我有第一行标题,我认为这会弄乱数据...如何跳过第一个 ?比你好多了。
    • 您可以在rows 变量上使用drop(1) 删除第一行。所以把rows.each_slice(2)改成rows.drop(1).each_slice(2)
    猜你喜欢
    相关资源
    最近更新 更多
    热门标签