2013-08-21 1 views
1

다음 코드는 사이트의 다른 섹션을 스크랩합니다.Nokogiri :: HTML을 한 번만 호출하도록 다음 메소드를 수정 하시겠습니까?

class Parser 
    def parse_details(html) 
    merged_hashes = {} 
    array_of_hashes = [ 
     self.parse_department(html), 
     self.parse_super_saver(html), 
    ] 
    array_of_hashes.inject(merged_hashes,:update) 

    return merged_hashes 
    end 

    def parse_department(file) 
    html  = file 
    data  = Nokogiri::HTML(open(html)) 
    department = data.css('#ref_2619534011') 

    @department_hash = {} 
    department.css('li').drop(1).each do | department | 
     department_title = department.css('.refinementLink').text 
     department_count = department.css('.narrowValue').text[/[\d,]+/].delete(",").to_i 
     @department_hash[:department] ||= {} 
     @department_hash[:department]["Pet Supplies"] ||= {} 
     @department_hash[:department]["Pet Supplies"][department_title] = department_count 
    end 

    return @department_hash 
    end 

    def parse_super_saver(file) 
    html  = file 
    data  = Nokogiri::HTML(open(html)) 
    super_saver = data.css('#ref_2661623011') 

    @super_saver_hash = {} 
    super_saver.css('li').each do | super_saver | 
     super_saver_title = super_saver.css('.refinementLink').text 
     super_saver_count = super_saver.css('.narrowValue').text[/[\d,]+/].delete(",").to_i 
     @super_saver_hash[:super_saver] ||= {} 
     @super_saver_hash[:super_saver][super_saver_title] = super_saver_count 
    end 

    return @super_saver_hash 
    end 

당신은 내가 Nokogiri::HTML(open(html)) 번 이상 전화 드렸습니다 볼 수 있듯이 : 나는 기본적으로 각 섹션에 대한 몇 가지 방법, 다음 하나 하나에 모든 해시를 병합하는 방법 (parse_details)가 있습니다.

def self.parse(html) 
    doc = Nokogiri::HTML html 
    self.parse_details(doc) unless doc.nil? 
    end 

그래서 내가 한 번만 Nokogiri::HTML 전화 :

사람이 같은 것을 할 날을 제안했다.

하지만 저는 붙어 있습니다. 예를 들어, department = data.css('#ref_2619534011')과 같은 부품으로 무엇을해야할지 모르겠지만 새로운 parse 방법을 사용할지 여부를 결정해야합니다. 나는 또한 htmlfile 인수로 무엇을해야할지 혼란 스럽다. 새로운 parse 방법을 사용한 후에는 거기에 그대로 두거나 제거해야합니까?

내가 원하는 것을 어떻게 달성 할 수 있을지 제안 해 주시겠습니까?

답변

1

간단한 변환 :

class Parser 
    def initialize(url) 
    @data = Nokogiri.HTML(open(url)) 
    end 
    def parse_details() 
    {}.tap do |merged_hashes| 
     array_of_hashes = [ 
     parse_department(), 
     parse_super_saver(), 
     ] 
     array_of_hashes.inject(merged_hashes,:update) 
    end 
    end 

    def parse_department() 
    department = @data.css('#ref_2619534011') 

    @department_hash = {} 
    department.css('li').drop(1).each do | department | 
     department_title = department.css('.refinementLink').text 
     department_count = department.css('.narrowValue').text[/[\d,]+/].delete(",").to_i 
     @department_hash[:department] ||= {} 
     @department_hash[:department]["Pet Supplies"] ||= {} 
     @department_hash[:department]["Pet Supplies"][department_title] = department_count 
    end 
    @department_hash 
    end 

    def parse_super_saver() 
    super_saver = @data.css('#ref_2661623011') 

    @super_saver_hash = {} 
    super_saver.css('li').each do | super_saver | 
     super_saver_title = super_saver.css('.refinementLink').text 
     super_saver_count = super_saver.css('.narrowValue').text[/[\d,]+/].delete(",").to_i 
     @super_saver_hash[:super_saver] ||= {} 
     @super_saver_hash[:super_saver][super_saver_title] = super_saver_count 
    end 
    @super_saver_hash 
    end 
end 

실제로 인스턴스 변수로 @department_hash@super_saver_hash이 필요하지 않은 경우, 당신은 내가 parse_details에 사용되는 tap 스타일로 변환하도록 선택할 수 있습니다. 실제로 모든 클래스,하지만 단지 방법의 컬렉션을 수 있도록이 필요하지 않은 경우

, 다음 대신 고려해

module Parser 
    def self.parse_details(url) 
    data = Nokogiri.HTML(open(url)) 
    {}.tap do |merged_hashes| 
     array_of_hashes = [ 
     parse_department(data), 
     parse_super_saver(data), 
     ] 
     array_of_hashes.inject(merged_hashes,:update) 
    end 
    end 

    def self.parse_department(data) 
    {}.tap do |department_hash| 
     data.css('#ref_2619534011 li').drop(1).each do | department | 
     department_title = department.css('.refinementLink').text 
     department_count = department.css('.narrowValue').text[/[\d,]+/].delete(",").to_i 
     department_hash[:department] ||= {} 
     department_hash[:department]["Pet Supplies"] ||= {} 
     department_hash[:department]["Pet Supplies"][department_title] = department_count 
     end 
    end 
    end 

    def self.parse_super_saver(data)  
    {}.tap do |super_saver_hash| 
     data.css('#ref_2661623011 li').each do |super_saver| 
     super_saver_title = super_saver.css('.refinementLink').text 
     super_saver_count = super_saver.css('.narrowValue').text[/[\d,]+/].delete(",").to_i 
     super_saver_hash[:super_saver] ||= {} 
     super_saver_hash[:super_saver][super_saver_title] = super_saver_count 
     end 
    end 
    end 
+0

감사합니다! 'let (: department_hash) {Parser.new.parse html_pet_supplies}'다음과 같은 오류가 발생합니다 :'오류/오류 : let (: department_hash) {Parser.new. 구문 분석 html_pet_supplies} 하면 ArgumentError : 인수 잘못된 번호 (1 0)'초기화 # ./parser.rb:4:in #'./parser_spec.rb:24:in 원인이 될 수 무엇 new'' ? – alexchenco

+0

"인자의 개수가 잘못되었습니다 (0은 1)"는 "인자가 1 개인 메소드를 호출하고, 그것을 0으로 지정하고 있습니다"를 의미합니다. 특히 최상위 코드를 사용하는 경우'Parser.new (url)'을 호출해야하며, 두 번째 코드를 사용하는 경우'Parser.parse_details (url)'을 호출해야합니다. – Phrogz

관련 문제