Nokogiri ruby​​:迭代没有类名的表行

时间:2014-09-25 22:36:37

标签: ruby nokogiri

我想遍历表的每一行。 这是相关的源代码,共显示6个表行。 其中3个没有类名,其他3个没有,...代表一些属性。

<tbody>

    <tr> … </tr>
    <tr class="even"> … </tr>
    <tr> … </tr>
    <tr class="even"> … </tr>
    <tr> … </tr>
    <tr class="even"> … </tr>

</tbody>

假设doc是Nokogiri :: HTML :: Document,下面的代码只生成3个tr元素而不是6个。它只返回具有class =“even”的tr元素。

doc.css('#main_result table tbody tr').each do |tr|
  p tr
end

我现在如何获得所有tr元素的数组,使其能够迭代它们?

可以在以下链接中找到此实际HTML: http://www.motogp.com/en/Results+Statistics/1949/TT/500cc/RAC

我真的不知道如何很好地粘贴源代码...抱歉

1 个答案:

答案 0 :(得分:2)

该页面中的HTML格式错误,并且缺少某些<tr>标记,它实际上看起来像这样:

<tbody>
    <td></td>
    ...
  </tr>
  <tr class="even">
    <td></td>
    ...
  </tr>
    <td></td>
    ...
  </tr>
  <tr class="even">
    <td></td>
    ...
  </tr>
    <td></td>
    ...
  </tr>
  <tr class="even">
    <td></td>
    ...
  </tr>
</tbody>

请注意,只有tr标记class="even"存在,其他标记丢失。因此,Nokogiri在解析页面时只看到三行。

一个可能的解决方案是使用Nokogumbo,它将Google的Gumbo HTML5解析器添加到Nokogiri,并更好地处理和纠正格式错误的HTML,如下所示:

require 'nokogumbo' # install the gem first

doc = Nokogiri.HTML5(the_page)

puts doc.css('#main_result table tbody tr').size
# should now be 6 rather than 3