如何使用Nokogiri解析HTML表?

如何使用Nokogiri解析HTML表?,html,ruby,nokogiri,mechanize,html-table,Html,Ruby,Nokogiri,Mechanize,Html Table,我安装了Ruby和Mechanize。在我看来,在Nokogiri可以做我想做的事,但我不知道如何去做 这个表怎么样?它只是vBulletin论坛网站HTML的一部分。我试图保留HTML结构,但删除了一些文本和标记属性。我想获得每个线程的一些详细信息,如:标题、作者、日期、时间、回复和视图 请注意,HTML文档中几乎没有表?我要找的是一张带有t正文的表,。我希望这个名字永远都是一样的。我可以在代码中使用t正文和名称 <table > <tbody> <t

我安装了Ruby和Mechanize。在我看来,在Nokogiri可以做我想做的事,但我不知道如何去做

这个
表怎么样?它只是vBulletin论坛网站HTML的一部分。我试图保留HTML结构,但删除了一些文本和标记属性。我想获得每个线程的一些详细信息,如:标题、作者、日期、时间、回复和视图

请注意,HTML文档中几乎没有表?我要找的是一张带有
t正文的表,
。我希望这个名字永远都是一样的。我可以在代码中使用
t正文
名称

<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>

1,320
#/usr/bin/ruby1.8
需要“nokogiri”
需要“pp”
html=“23:35”,
#=>:title=>“Vb4黄金发布”,
#=>:编号=>“24”,
#=>:日期=>“2010年1月6日”,
#=>:视图=>“1320”,
#=>:name=>“Paul M”}]

事实上,属性可以使查找数据变得更容易,尤其是使用xpath时。@Wayne您能告诉我为什么属性可以使查找数据更容易吗?通常您会发现所需的数据具有特定的属性,这些属性恰好使您更容易构建xpath来查找数据。例如,如果您想要的表是“,并且还有其他您不想要的表,但没有一个表具有CSS类,那么选择您想要的表的xpath就是:“//table[@class='message']“注意:使用
标记作为路径点或选择器时要非常小心。虽然规范中说HTML应该有它们,但它们不是必需的,而且很多在野外的HTML在表定义中没有它们。问题是浏览器通常在呈现页面时添加它们,并在查看页面源代码时显示它们,因此不要信任浏览器的HTML源代码视图。相反,总是在命令行中使用
wget
curl
nokogiri
来查看实际的页面源代码,以验证实际的标记。我认为css等价物应该是
doc.css('tbody#threadbits_forum_251 tr')
,但我还没有在代码中实际测试过这一点…@Kejadlen,我替换了doc.xpath(…)用doc.css调用调用,效果很好。有没有可能有人向我解释一下语法?先谢谢你,你怎么了?是Ruby语法,还是xpath语法,或者两者都有?主要是因为哈希数组是可能工作的最简单的东西,这使得示例更加清晰。另外,我不知道这对您是否重要,在Ruby<1.9中,哈希没有定义好的顺序,因此您会丢失行的原始顺序。
#!/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"}]