2013-08-22 28 views
0

我有一些像這樣的代碼:如果陳述適用於某種情況,但是對於另一種情況則失敗?

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 

該工程確定:

results = @data.css('#refinements ul').first 
    unless results 
     @results_hash = {} 
     return @results_hash 
    end 

當沒有一個#refinements ul元素,代碼將停止,並返回一個空的灰。

但在

category = @data.at_css('#zg_listTitle span') 
    unless category 
     @category_hash = {} 
     return @category_hash 
    end 

代碼的情況下,似乎即使沒有任何#zg_listTitle span元素繼續。

可能是什麼問題?

編輯:

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 
+0

我無法重現您的問題。添加足夠的html來重現問題真的有幫助。 –

+0

並刪除所有無關的代碼,只留下必要的代碼來重現問題。請參閱http://sscce.org/ –

回答

1

如果沒有找到#zg_listTitle span然後,@data.at_css('#zg_listTitle span')將返回nil。所以我認爲你需要使用if而不是unless

category = @data.at_css('#zg_listTitle span') 
if category 
    @category_hash = {} 
    return @category_hash 
end 
+0

當'#zg_listTitle span'爲'nil'時,代碼應該停止。如果它不是'nil'則應該繼續。我認爲除非在這裏沒問題。 – alexchenco

+0

@alexchenco不,你有點困惑,我想.. :) –

+1

整個點,除非語句是停止代碼,如果'類是零'所以它讀:「觸發此代碼停止一切**除非**類別是零而不是零「我在這裏混淆了什麼? – alexchenco

相關問題