Как заставить Нокогири игнорировать несуществующие элементы HTML - PullRequest
1 голос
/ 19 марта 2010

Любая идея, как я могу получить код ниже, чтобы произвести этот вывод?

1 -
2 - B

Я получаю эту ошибку "неопределенный метод` text 'для 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 ]

1 голос
/ 19 марта 2010

Если таблиц всего две, вы можете сделать следующее:

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"
0 голосов
/ 19 марта 2010

Не вызывайте метод text (), пока не убедитесь, что у вас есть элемент. Вы можете разделить ваш звонок r1 = n.at_css(".r1").text на две строки или использовать || (идиома ruby ​​null coalescing) для установки значения r1 в значение по умолчанию, когда метод at_css () возвращает nil.

...