如何让Nokogiri忽略不存在的HTML元素

时间:2010-03-19 02:07:37

标签: css ruby parsing nokogiri

任何想法我怎么能得到下面的代码来产生这个输出?

1 -
2 - B

我收到这个错误“未定义的方法`文本'为nil:NilClass(NoMethodError)”,因为我认为表1中没有元素'td class = r2'。

require 'rubygems'  
require 'nokogiri'  
require 'open-uri'

doc = Nokogiri::HTML.parse(<<-eohtml)
<table class="t1">
    <tbody>
        <tr>
            <td class="r1">1</td>
        </tr>
</tbody>
</table>
<table class="t2">
    <tbody>
        <tr>
            <td class="r1">2</td>
            <td class="r2">B</td>
        </tr>
    </tbody>            
</table>  
eohtml

doc.css('tbody > tr').each do |n|
    r1 = n.at_css(".r1").text
    r2 = n.at_css(".r2").text
    puts "#{r1} - #{r2}"
end

2 个答案:

答案 0 :(得分:1)

如果只有两个表,那么您可以执行以下操作:

t1_r1 = doc.xpath('//table[@class="t1"]//td[@class="r1"]').text
t1_r2 = doc.xpath('//table[@class="t1"]//td[@class="r2"]').text
t2_r1 = doc.xpath('//table[@class="t2"]//td[@class="r1"]').text
t2_r2 = doc.xpath('//table[@class="t2"]//td[@class="r2"]').text

让我们测试一下结果。

>> "#{t1_r1} - #{t1_r2}"
=> "1 - "
>> "#{t2_r1} - #{t2_r2}"
=> "2 - B"

答案 1 :(得分:0)

在您确认自己有元素之前,请不要调用text()方法。您可以将通话r1 = n.at_css(".r1").text分成两行,或使用|| (ruby null coalescing idiom)在at_css()方法返回nil时将r1设置为默认值。