如何使用Nokogiri解析HTML表格?

Rad*_*dek 34 html ruby html-table mechanize nokogiri

我安装了Ruby和Mechanize.在我看来,Nokogiri可以做我想做的事,但我不知道该怎么做.

那怎么样table?它只是vBulletin论坛网站HTML的一部分.我试图保留HTML结构,但删除了一些文本和标记属性.我想获得每个帖子的一些细节:标题,作者,日期,时间,回复和视图.

请注意HTML文档中的表格很少?我正在追寻一张特别的桌子tbody,<tbody id="threadbits_forum_251">.名称将始终相同(我希望).我可以在代码中使用tbodyname吗?

<table >
  <tbody>
    <tr>  <!-- table header --> </tr>
  </tbody>
  <!-- show threads -->
  <tbody id="threadbits_forum_251">
    <tr>
      <td></td>
      <td></td>
      <td>
        <div>
          <a href="showthread.php?t=230708" >Vb4 Gold Released</a>
        </div>
        <div>
          <span><a>Paul M</a></span>
        </div>
      </td>
      <td>
          06 Jan 2010 <span class="time">23:35</span><br />
          by <a href="member.php?find=lastposter&amp;t=230708">shane943</a> 
        </div>
      </td>
      <td><a href="#">24</a></td>
      <td>1,320</td>
    </tr>

  </tbody>
</table>
Run Code Online (Sandbox Code Playgroud)

Way*_*rad 55

#!/usr/bin/ruby1.8

require 'nokogiri'
require 'pp'

html = <<-EOS
  (The HTML from the question goes here)
EOS

doc = Nokogiri::HTML(html)
rows = doc.xpath('//table/tbody[@id="threadbits_forum_251"]/tr')
details = rows.collect do |row|
  detail = {}
  [
    [:title, 'td[3]/div[1]/a/text()'],
    [:name, 'td[3]/div[2]/span/a/text()'],
    [:date, 'td[4]/text()'],
    [:time, 'td[4]/span/text()'],
    [:number, 'td[5]/a/text()'],
    [:views, 'td[6]/text()'],
  ].each do |name, xpath|
    detail[name] = row.at_xpath(xpath).to_s.strip
  end
  detail
end
pp details

# => [{:time=>"23:35",
# =>   :title=>"Vb4 Gold Released",
# =>   :number=>"24",
# =>   :date=>"06 Jan 2010",
# =>   :views=>"1,320",
# =>   :name=>"Paul M"}]
Run Code Online (Sandbox Code Playgroud)

  • 我认为css等价物是`doc.css('tbody#threadbits_forum_251 tr')`,但我实际上没有在代码中测试过... (3认同)
  • 大多数情况下,因为一系列哈希是最简单的事情,可能会有所作为,这是一个更清晰的例子.另外,我不知道这对你是否重要,在Ruby <1.9中,哈希没有明确定义的顺序,因此你会丢失行的原始顺序. (3认同)