Ошибка сегментации Нокогири?
Я пытаюсь запустить простой скрипт на Ruby из Railscast, и как только я запускаю свою программу, я получаю следующую ошибку ошибки Сегментации. Я попытался удалить и переустановить Nokogiri и LibXML и до сих пор ничего. Есть ли способ исправить версию Ruby 1.87? Может в этом проблема?
$ ruby -v
ruby 1.9.2p180 (2011-02-18 revision 30909) [x86_64-darwin10.7.0]
/Users/da/.rvm/gems/ruby-1.9.2-p180/gems/nokogiri-1.4.4/lib/nokogiri/nokogiri.bundle:
[BUG] Segmentation fault ruby 1.8.7 (2009-06-12 patchlevel 174) [universal-darwin10.0]
Abort trap $ ruby -v ruby 1.9.2p180
(2011-02-18 revision 30909)
[x86_64-darwin10.7.0] $ bundle exec
nokogiri -v—
--- warnings: []
nokogiri: 1.4.4
ruby:
version: 1.9.2
platform: x86_64-darwin10.7.0
engine: ruby
libxml:
binding: extension
compiled: 2.7.7
loaded: 2.7.7
Это код, который я использовал:
#!/usr/bin/ruby -w
require 'rubygems'
require 'nokogiri'
require 'open-uri'
url = "http://www.walmart.com/search/search-ng.do?search_constraint=0&ic=48_0&search_query=batman&Find.x=0&Find.y=0&Find=Find"
doc = Nokogiri::HTML(open(url))
puts doc.at_css("title").text
doc.css(".item").each do |item|
title = item.at_css(".prodLink").text
price = item.at_css(".PriceCompare .BodyS, .PriceXLBold").text[/\$[0-9\.]+/]
puts "#{title} - #{price}"
puts item.at_css(".prodLink")[:href]
end
2 ответа
Вы заставляете установленный на Apple Ruby, который является Ruby 1.8.7:
#!/usr/bin/ruby -w
вместо одного из ваших Рубинов, управляемых RVM. Пытаться:
#!/usr/bin/env ruby -w
Таким образом, если вы хотите, чтобы ваша система Ruby запускала код, вы можете указать RVM переключиться на него:
rvm use system
и он ответит: Now using system ruby.
Кроме того, вы можете использовать любой из управляемых RVM Ruby для запуска кода:
rvm 1.8.7
если у вас был RVM, установите экземпляр 1.8.7 или
rvm 1.9.2
или же
rvm default
если вы устанавливаете Ruby по умолчанию для RVM, что всегда является хорошей идеей:
rvm use 1.9.2 --default
Вы можете проверить, какие версии Ruby RVM находятся под его контролем:
$ rvm list
rvm rubies
ruby-1.8.7-p334 [ x86_64 ]
=> ruby-1.9.2-p180 [ x86_64 ]
Теперь, переходя к реальному коду, у вас есть ошибка. При попытке получить цену за элемент вы ищете неправильный CSS, не находя ценовой узел, получая nil
значение, а затем пытается получить text
от него. Используйте это вместо:
price = item.at_css(".camelPrice").text[/\$[0-9\.]+/]
Ваш вывод будет выглядеть примерно так:
Колеса с электроприводом Fisher-Price Бэтмен Lil Quad Ride-On - 59,97 $ / Ф /Fisher-Price Batman-Лил-Quad/10098697
После внесения изменений в #!
линия и исправление к price
Кроме того, я запустил ваш код, используя Ruby 1.8.7 в моей системе, вместе с RVM, управляемым 1.8.7 и 1.9.2, без проблем.
Может быть, решение, описанное в этом посте, будет работать для вас: Обновление до ruby 1.9.2 и получение ошибок Segmentation Fault в nokogiri