Негогири Сегментация вина? - PullRequest
5 голосов
/ 07 апреля 2011

Я пытаюсь запустить простой скрипт 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 ]

16 голосов
/ 07 апреля 2011

Вы заставляете Ruby, установленный Apple, запускаться, то есть Ruby 1.8.7:

#!/usr/bin/ruby -w

вместо одного из ваших Ruby, управляемых 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 Power Wheels Batman Lil Quad Ride-On
 - $59.97
/ip/Fisher-Price-Batman-Lil-Quad/10098697

После внесения изменения в строку #! и исправления в строку price,Я запустил ваш код, используя Ruby 1.8.7 в моей системе, вместе с управляемыми RVM 1.8.7 и 1.9.2 без проблем.

1 голос
/ 07 апреля 2011

Может быть, решение, описанное в этом посте, будет работать для вас: Обновлен до ruby ​​1.9.2 и выдает ошибки Сегментации в nokogiri

...