我刚开始使用 Ruby On Rails,并想创建一个简单的网站爬虫,它:
- 浏览所有 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))
,那么它给了我整个页面,但是,解析仍然不起作用。