Ваша проблема связана с плохим селектором XPath и не связана с Nokogiri или Hpricot.Давайте исследуем:
irb:01:0> require 'nokogiri'; require 'open-uri'
#=> true
irb:02:0> doc = Nokogiri::HTML(open('http://www.changebadtogood.com/')); nil
#=> nil
irb:03:0> doc.xpath('//*[@id="view_more"]').each{ |link| puts link.content }
View more issues ..
#=> 0
irb:04:0> doc.at('#view_more').text # Simpler version of the above.
#=> "View more issues .."
irb:05:0> doc.xpath('/html/body/div[4]/div[3]/h1/span')
#=> []
irb:06:0> doc.xpath('/html/body/div[4]')
#=> []
irb:07:0> doc.xpath('/html/body/div').length
#=> 2
Из этого мы можем видеть, что есть только два div, которые являются дочерними элементами элемента <body>
, и поэтому div[4]
не может выбрать один.
ItПохоже, вы пытаетесь выбрать диапазон здесь:
<h1 class="landing_page_title">
Change <span style='color: #808080;'>Bad</span> To Good
</h1>
Вместо того, чтобы полагаться на хрупкую разметку, ведущую к этому (индексация анонимных иерархий элементов), используйте семантическую структуру документа в ваших интересахдля селектора, который является одновременно более простым и надежным.Использование синтаксиса CSS или XPath:
irb:08:0> doc.at('h1.landing_page_title > span').text
#=> "Bad"
irb:09:0> doc.at_xpath('//h1[@class="landing_page_title"]/span').text
#=> "Bad"