在Rails中使用Scrapi 3 ..获取分段错误错误/中止陷阱

时间:2010-09-29 23:12:00

标签: ruby-on-rails ruby screen-scraping web-scraping

到目前为止我做了什么..

sudo gem install scrapi

sudo gem install tidy

这不起作用,因为它没有libtidy.dylib

所以我这样做了:

sudo port install tidy

sudo cp libtidy.dylib /Library/Ruby/Gems/1.8/gems/scrapi-1.2.0/lib/tidy/libtidy.dylib

然后我开始关注简单的railscast:http://media.railscasts.com/videos/173_screen_scraping_with_scrapi.mov

在贝茨先生完成scrapitest.rb的第一次保存之后,我尝试运行此代码:

require 'rubygems'
require 'scrapi'

scraper = Scraper.define do
  process "title", :page_name => :text
  result :page_name
end

uri = URI.parse("http://www.walmart.com/search/search-ng.do?search_query=lost+season+3&ic=48_0&search_constraint=0")
p scraper.scrape(uri)

使用此代码:

ruby scrapitest.rb

它返回了这个错误:

/Library/Ruby/Gems/1.8/gems/tidy-1.1.2/lib/tidy/tidybuf.rb:39: [BUG] Segmentation fault
ruby 1.8.7 (2009-06-12 patchlevel 174) [universal-darwin10.0]

Abort trap

完全没有想法..

2 个答案:

答案 0 :(得分:2)

我遇到了这个问题,然后是一个后续问题,其中seg故障会以非确定性的方式发生。

我按照这里的步骤进行了操作 - http://rubyforge.org/tracker/index.php?func=detail&aid=10007&group_id=435&atid=1744

在tidy-1.1.2 / lib / tidy / tidylib.rb中:

1.将此行添加到Tidylib中的'load'方法:

  extern "void tidyBufInit(void*)"
2.在Tidylib中定义一个名为'buf_init'的新方法:

  # tidyBufInit, using default allocator
  #
  def buf_init(buf)
    tidyBufInit(buf)
  end

然后,在tidy-1.1.2 / lib / tidy / tidybuf.rb中:

3.将此行添加到malloc下面的Tidybuf的initialize方法:

   Tidylib.buf_init(@struct)

所以看起来像这样:


  # tidyBufInit, using default allocator
  #
  def buf_init(buf)
    @struct = TidyBuffer.malloc
    Tidylib.buf_init(@struct)
  end
4.为了完整性,通过将分配器字段添加到TidyBuffer结构来进行Brennan的更改,使其看起来像这样:

  TidyBuffer = struct [
    "TidyAllocator* allocator",
    "byte* bp",
    "uint size",
    "uint allocated",
    "uint next"
  ] 

答案 1 :(得分:1)

如果您收到错误: /opt/ruby/ruby-1.8.6/lib/ruby/gems/1.8/gems/tidy-1.1.2/lib/tidy/tidybuf.rb:40: [BUG]分段错误

这是因为数据类型在最新的Tidy(0.99)中不匹配(/usr/include/buffio.h - $ Date:2007/01/23 11:17:45 $)

决议是修补tidybuf.rb:

--- tidybuf.rb  2007-04-10 09:09:01.000000000 -0500
+++ tidybuf.rb.patched  2007-04-10 09:08:55.000000000 -0500
@@ -11,6 +11,7 @@
   # Mimic TidyBuffer.
   #
   TidyBuffer = struct [
+    "int* allocator",
     "byte* bp",
     "uint size",
     "uint allocated",