我想遍历表的每一行。 这是相关的源代码,共显示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
我真的不知道如何很好地粘贴源代码...抱歉
答案 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