Reputation: 55283
I got some code like this:
require 'nokogiri'
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
## Categories
(etc...)
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
## Hot Lists
def self.parse_category
category = @data.at_css('#zg_listTitle span')
unless category
@category_hash = {}
return @category_hash
end
@category_hash = {}
@category_hash[:category] ||= {}
@category_hash[:category] = @data.at_css('#zg_listTitle span').text
return @category_hash
end
end
This works OK:
results = @data.css('#refinements ul').first
unless results
@results_hash = {}
return @results_hash
end
When there isn't a #refinements ul
element, the code stops and an empty ash is returned.
But in the case of
category = @data.at_css('#zg_listTitle span')
unless category
@category_hash = {}
return @category_hash
end
The code seems to continue even though there isn't any #zg_listTitle span
element.
What could be the problem?
EDIT:
Rspec:
require File.dirname(__FILE__) + '/parser.rb'
def html_pet_supplies
File.open("parse_categories/amazon_pet_supplies.html")
end
def html_dog_supplies
File.open("parse_categories/amazon_dog_supplies.html")
end
def html_bird_supplies
File.open("parse_categories/amazon_bird_supplies.html")
end
def html_baby
File.open("parse_hotlists/amazon_baby.html")
end
(etc.)
describe "Results (Dogs)" do
let(:results_hash) { Parser.parse html_dog_supplies }
it "should return correct hash" do
expect(results_hash[:results]).to eq(514265)
end
end
## Hot Lists
describe "Category" do
let(:category_hash) { Parser.parse html_baby }
it "should return correct hash" do
expect(category_hash[:category]).to eq("Baby")
end
end
Upvotes: 0
Views: 50
Reputation: 118271
if the #zg_listTitle span
not found then, @data.at_css('#zg_listTitle span')
will return nil
. So I think you need to use if
instead of unless
.
category = @data.at_css('#zg_listTitle span')
if category
@category_hash = {}
return @category_hash
end
Upvotes: 1