如何使用 Nokogiri 解析 HTML 表格?

Posted

技术标签:

【中文标题】如何使用 Nokogiri 解析 HTML 表格?【英文标题】:How do I parse an HTML table with Nokogiri? 【发布时间】:2011-01-04 22:41:08 【问题描述】:

我安装了 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>

【问题讨论】:

实际上,属性可以让查找数据变得更容易,尤其是使用 xpath。 @Wayne 你能告诉我为什么属性可以使它更容易吗? 您经常会发现您想要的数据具有特定属性,这些属性恰好使您更容易构建 xpath 来挑选这些数据。例如,如果您想要的表格是“,并且还有其他表格您不想要,但它们都没有那个 CSS 类,那么用于挑选您想要的表格的 xpath 很简单: "//table[@class='message']" 注意: 尝试将&lt;tbody&gt; 标签用作路标或在选择器中时要非常小心。虽然规范说 HTML 应该有它们,但它们不是必需的,而且很多 HTML 在表定义中没有它们。问题是浏览器经常在渲染页面时添加它们,并在查看页面源时显示它们,所以不要相信浏览器的 HTML 源视图。而是始终在命令行中使用wgetcurlnokogiri 来查看实际页面源以验证实际标记。
【参考方案1】:
#!/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"]

【讨论】:

我认为 css 等价物是 doc.css('tbody#threadbits_forum_251 tr'),但我实际上并没有在代码中测试过... @Kejadlen,我用您的 doc.css 调用替换了 doc.xpath(...) 调用,效果很好。 有人会向我解释语法吗?提前谢谢你。 你被什么难住了?是 Ruby 语法、xpath 语法,还是两者兼而有之? 大多数情况下,因为哈希数组是可能工作的最简单的东西,这是一个更清晰的例子。另外,我不知道这对您是否重要,在 Ruby

以上是关于如何使用 Nokogiri 解析 HTML 表格?的主要内容,如果未能解决你的问题,请参考以下文章

创建“Nokogiri::XML”或“Nokogiri::HTML”对象时如何避免创建无意义的空白文本节点

我无法解析页面并获取链接 Nokogiri

如何使用Nokogiri解析带有非对标签的XML

[翻译][Ruby教程]Nokogiri - 解析HTML/XML文档 / Parsing an HTML/XML Document

如何使用 Nokogiri 获取没有任何文本内容的完整 HTML

如何使用 Nokogiri 在 TMX 中搜索道具元素