次のコードを使用して、サイト内のセクションを破棄しています。
class Parser
def self.parse(html)
@data = Nokogiri.HTML(open(html))
merged_hashes = {}
array_of_hashes = [
parse_department,
parse_super_saver,
parse_new_arrivals,
parse_out_of_stock,
parse_categories,
parse_results,
parse_category
]
array_of_hashes.inject(merged_hashes,:update)
return merged_hashes
end
.
.
.
def self.parse_results
results = @data.css('#refinements ul').first
unless results
@results_hash = {}
return @results_hash
end
if results.css('li:nth-child(1) a span').text == "Pet Supplies"
@results_hash = {}
@results_hash[:results] ||= {}
@results_hash[:results] = @data.at_css('#resultCount span').text[/(\S+) Results$/i, 1].delete(",").to_i
else
@results_hash = {}
end
return @results_hash
end
この部分でわかるように:
results = @data.css('#refinements ul').first
unless results
@results_hash = {}
return @results_hash
end
の場合、コードを停止していresults
ますnil
。その理由は、.at_css
以下のメソッドが nil 値に適用されるとコードが壊れてしまうからです。
これは、メソッドが探している CSS セレクターが html にない場合があるために発生します。
だからこそ、そこでコードを止めたいのです。
各方法でそれを繰り返す必要があります。これを行うためのよりシンプルまたはよりエレガントな方法はありますか?