2016-09-27 14 views
-2

Rubyでブログをクロールし、Anemoneの宝石とレーキを使って壊れた外部リンクを見つけるように設計されたWebクローラーの作成についてもっと学び始めました以下のタスク...Anemone - NoMethodError:未定義メソッド `xpath 'for nil:NilClass

task :testing_this => :environment do 
    require 'anemone' 
    rooter = 'myblog.com' 
    banned = ['tel:','@', '#', 'facebook.com', 'twitter.com', 'pinterest.com', 'linkedin.com', 'youtube.com','reddit.com', 'wikipedia.org'] 
    extensions = %w(.jpg .jpeg .png .doc .pdf .js .css .xml .csv. .exe .zip .gzip) 
    start = Time.now 
    Anemone.crawl("http://#{rooter}/", {:threads => 4, :discard_page_bodies => false, :obey_robots_txt => false, :user_agent => 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36'}) do |anemone| 
     begin 
      anemone.on_every_page do |page| 
       puts page.url.path 
     links = page.doc.xpath("//a/@href") 
     if (links != nil) 
      links.each do |link| 
      this_link = link.to_s 
      unless extensions.any? { |exten| this_link && this_link.include?(exten) } 
       unless banned.any? { |word| this_link && this_link.include?(word) } 
        unless this_link.include? rooter 
         # puts this_link 
         obl = URI.parse(URI.encode(this_link.strip)).host 
         unless obl.blank? 
          if obl.include? 'www.' 
           obl = obl.gsub("www.", "") 
          end 
          Obl.find_or_create_by(url: obl) 
         end 
        end 
        end 
       end 
      end 
     end 
     end 
    rescue OpenURI::HTTPError => ex 
    puts ex 
    end 
    end 
    time_t = Time.now - start 
    puts "-------------" 
    puts "#{time_t} seconds" 
    puts "-------------" 
end 

それはしかし、私はそれをテストするためにhttps://arthurdejong.org/webcheck/demo/を使用してきたと私は次のエラー取得しています、私のデモフォルダに取り組んでいます:私が試した

NoMethodError: undefined method `xpath' for nil:NilClass 

をそれが問題を引き起こしていたのかどうか疑問に思いましたが運がない。

これをデバッグする方法や問題を解決する方法についてのヒントはありますか?

+1

私はそれが非常に読みにくいとデバッグであるため、最初にこのコードをリファクタリングお勧めします。一度それが完了すると、そのバグがそれ自身で発見される可能性があります。 –

+0

提案してくれてありがとうArtur - 私が言ったように、私はRubyとWebクローラーにはかなり新しいので、今はコードをリファクタリングする時が来ています:-) –

答えて

0

page.doc.xpathからエラーが来ているようです:page.docはnilです。

inspectpageon_every_pageの方法を試してください。

また、エラーを回避するために.xpathifを追加することができます。

anemone.on_every_page do |page| 
    puts page.url.path 
    if page.doc.present? 
    links = page.doc.xpath("//a/@href") 
+0

.present?問題を修正し、エラーを回避しました。 –

関連する問題