Css 如何让Nokogiri忽略没有';不存在

Css 如何让Nokogiri忽略没有';不存在,css,ruby,parsing,nokogiri,Css,Ruby,Parsing,Nokogiri,你知道我如何得到下面的代码来产生这个输出吗 1- 2-B 我得到了这个错误“nil:NilClass(NoMethodError)的未定义方法'text',因为我认为表1中没有元素'td class=r2' require 'rubygems' require 'nokogiri' require 'open-uri' doc = Nokogiri::HTML.parse(<<-eohtml) <table class="t1"> <tbody&g

你知道我如何得到下面的代码来产生这个输出吗

1-
2-B

我得到了这个错误“nil:NilClass(NoMethodError)的未定义方法'text',因为我认为表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
需要“rubygems”
需要“nokogiri”
需要“打开uri”

doc=Nokogiri::HTML.parse(在验证有元素之前不要调用text()方法。您可以将调用拆分为两行,或者在at_css()方法返回nil时使用| |(ruby空合并习惯用法)将r1设置为默认值。

不要调用text()方法,直到验证是否有元素为止。您可以将调用拆分为两行,或者在at_css()方法返回nil时使用| | |(ruby空合并习惯用法)将r1设置为默认值。

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

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"

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

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"