我正在使用以下代码在网站中抓取部分:
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值,则代码将中断。
发生这种情况是因为有时html不会具有该方法正在寻找的CSS选择器。
这就是为什么我要在那里停止代码。
我必须在每种方法中都重复一遍。有没有更简单或更优雅的方式来做到这一点?
你可以写
return {} if results.nil?
不过,我确实有一些建议:
您真的需要设置@results_hash
吗?因为我认为它根本不应该是实例变量。def self.parse_results
无论如何,您都在使用类方法()。
为什么需要将结果嵌套在其中@results_hash[:results]
?我认为,results_hash
直接填写就足够了。这样,您可以一次用空哈希值初始化results_hash
变量。
该行@results_hash[:results] ||= {}
确实是多余的,因为无论如何您会立即在下一行中覆盖该值。
Ruby隐式返回last表达式的值,因此您可以删除last return
。尽管需要习惯于这种表示法,但它的使用却很广泛,通常被认为是“好风格”
就是说,我会这样写方法:
def self.parse_results
results_hash = {}
results = @data.css('#refinements ul').first
return results_hash if results.nil?
if results.css('li:nth-child(1) a span').text == "Pet Supplies"
results_hash = @data.at_css('#resultCount span')
.text[/(\S+) Results$/i, 1]
.delete(",")
.to_i
end
results_hash
end
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句