Ruby On Rails を使い始めたばかりで、次のような単純な Web サイト クローラーを作成したいと考えています。
- すべての Sherdog ファイターのプロフィールを調べます。
- 審判の名前を取得します。
- 名前を古いものと比較します (サイトの解析中とファイルからの両方)。
- すべての一意の名前を出力してファイルに保存します。
URL の例: http://www.sherdog.com/fighter/Fedor-Emelianenko-1500
<span class="sub_line">Dan Miragliotta</span>
残念ながら、必要な適切なレフェリー名に加えて、次のようなタグエントリを検索しています。同じ種類のクラスが次のように使用されています。
- 日付。
- レフェリー名が不明の場合は「N/A」。
「N/A」文字列と数字を含む文字列を含むすべての結果を破棄する必要があります。前半はできたのですが、後半のやり方がわかりませんでした。私は検索、思考、実験を試みましたが、実験と書き直しの後、なんとかプログラム全体を壊し、それを(適切に)修正する方法がわかりません:
require 'rubygems'
require 'hpricot'
require 'simplecrawler'
# Set up a new crawler
sc = SimpleCrawler::Crawler.new("http://www.sherdog.com/fighter/Fedor-Emelianenko-1500")
sc.maxcount = 1
sc.include_patterns = [".*/fighter/.*$", ".*/events/.*$", ".*/organizations/.*$", ".*/stats/fightfinder\?association/.*$"]
# The crawler yields a Document object for each visited page.
sc.crawl { |document|
# Parse page title with Hpricot and print it
hdoc = Hpricot(document.data)
(hdoc/"td/span[@class='sub_line']").each do |span|
if span.inner_html == 'N/A' || Regexp.new(".*/\d\.*$").match(span.inner_html)
# puts "Test"
else
puts span.inner_html
#File.open("File_name.txt", 'a') {|f| f.puts(hdoc.span.inner_html) }
end
end
}
また、プログラムの残りの部分に関するアイデアについても助けていただければ幸いです。プログラムが複数回実行されている場合、ファイルから現在の名前を適切に読み取るにはどうすればよいですか?また、一意の名前を比較するにはどうすればよいですか?
編集:
いくつかの提案された改善の後、ここに私が得たものがあります:
require 'rubygems'
require 'simplecrawler'
require 'nokogiri'
#require 'open-uri'
sc = SimpleCrawler::Crawler.new("http://www.sherdog.com/fighter/Fedor-Emelianenko-1500")
sc.maxcount = 1
sc.crawl { |document|
doc = Nokogiri::HTML(document.data)
names = doc.css('td:nth-child(4) .sub-line').map(&:content).uniq.reject { |c| c == 'N/A' }
puts names
}
残念ながら、コードはまだ機能せず、空白が返されます。
の代わりにdoc = Nokogiri::HTML(document.data)
を書くdoc = Nokogiri::HTML(open(document.data))
と、ページ全体が表示されますが、解析はまだ機能しません。