2010-09-29 10 views
3

Ce que je l'ai fait jusqu'à présent ..Jouer avec Scrapi dans Rails 3 .. obtenir erreur Segmentation Fault/Abandonner Piège

sudo gem install scrapi 

sudo gem install tidy 

Cela ne fonctionne pas parce qu'il n'a pas le libtidy.dylib

donc je l'ai fait:

sudo port install tidy 

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

Puis je commencé à suivre simple Railscast à: http://media.railscasts.com/videos/173_screen_scraping_with_scrapi.mov

Juste après M. Bates a terminé le premier pour sauver scrapitest.rb, j'ai essayé d'exécuter ce code:

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) 

Avec ce code:

ruby scrapitest.rb 

Et il est revenu cette erreur:

/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 

Complètement à court d'idées ..

Répondre

2

J'ai eu ce problème et ensuite un problème de suivi où une erreur seg se produirait de façon non déterministe.

J'ai suivi les étapes ici - http://rubyforge.org/tracker/index.php?func=detail&aid=10007&group_id=435&atid=1744

Tidy-1.1.2/lib/bien rangé/tidylib.rb:

1. Ajoutez cette ligne à la méthode 'de charge' dans Tidylib:

    extern "void tidyBufInit(void*)" 
2. Définir une nouvelle méthode appelée 'buf_init' dans Tidylib:

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

Puis, bien rangé-1.1.2/lib/bien rangé/tidybuf.rb:

3. Ajoutez cette ligne à la méthode initialize de Tidybuf en dessous du malloc:

    Tidylib.buf_init(@struct) 

si c'est ressemble à ceci:


    # tidyBufInit, using default allocator 
    # 
    def buf_init(buf) 
    @struct = TidyBuffer.malloc 
    Tidylib.buf_init(@struct) 
    end 
4. Pour être complet, faire le changement de Brennan en ajoutant le champ allocateur à la TidyBuffer struct de sorte qu'il ressemble à ceci:

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

Excellent post NatGordon. Cela a vraiment très bien réussi. – Trip

1

Si vous obtenez l'erreur: /opt/ruby/ruby-1.8.6/lib/ruby/gems/1.8/gems/tidy-1.1.2/lib/tidy/tidybuf.rb:40: [BUG] Segmentation fault

Il est parce que le les types de données ne correspondent pas dans la dernière Tidy (0.99) (/usr/include/buffio.h - $ Date: 2007/01/23 11:17:45 $)

La résolution est de patcher 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",