【问题标题】:Playing with Scrapi in Rails 3.. getting Segmentation Fault error / Abort Trap在 Rails 3 中玩 Scrapi .. 得到 Segmentation Fault 错误/Abort Trap
【发布时间】:2010-09-29 23:11:59
【问题描述】:

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

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

完全没有想法..

【问题讨论】:

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


    【解决方案1】:

    我遇到了这个问题,然后是一个后续问题,即非确定性地发生段错误。

    我按照这里的步骤操作 - 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"
      ] 
    

    【讨论】:

    • 优秀的帖子 NatGordon。这真的很好地触动了它。
    【解决方案2】:

    如果您收到错误消息: /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",    
    

    【讨论】:

      猜你喜欢
      • 2018-08-15
      • 1970-01-01
      • 1970-01-01
      • 2017-11-26
      • 2011-06-30
      • 1970-01-01
      • 2016-08-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多