2016-07-12 5 views
0

Ich habe einige 'generische' Methoden, die Daten basierend auf CSS-Selektoren extrahieren, die normalerweise in vielen Websites gleich sind. Allerdings habe ich eine andere Methode, die als Argument die CSS-Selektor für eine bestimmte Website akzeptieren.Ruby Bedingtes Argument zu Methode

Ich muss die Methode get_title aufrufen, wenn das Argument title_selector nicht übergeben wird. Wie kann ich das machen?

Scrape, die CSS-Selektoren als Argumente

def scrape(urls, item_selector, title_selector, price_selector,  image_selector) 
    collection = [] 
    urls.each do |url| 
     doc = Nokogiri::HTML(open(url).read) # Opens URL 
     @items = doc.css(item_selector)[0..1].map {|item| item['href']} # Sets items 
     @items.each do |item| # Donwload each link and parse 
     page = Nokogiri::HTML(open(item).read) 
     collection << { 
      :title => page.css(title_selector).text, # I guess I need conditional here 
      :price => page.css(price_selector).text 
     } 
     end 
     @collection = collection 
    end 
    end 

Allgemeine Bezeichnung Extraktor

def get_title(doc) 
    if doc.at_css("meta[property='og:title']") 
     title = doc.css("meta[property='og:title']") 
    else doc.css('title') 
     title = doc.at_css('title').text 
    end 
    end 

Antwort

2

einen or Operator in Ihrem page.css Anruf annehmen verwenden. Es wird get_title aufgerufen, wenn title_selector falsch (Null) ist.

:title => page.css(title_selector || get_title(doc)).text, 

Ich bin mir nicht sicher, was doc eigentlich in diesem Zusammenhang sein sollte, though.

EDIT

Sie Ihren Kommentar unten gegeben, ich glaube, Sie nur get_title die gesamte Logik zu behandeln Refactoring kann. Lassen Sie get_title einen optionalen title_selector Parameter zu übernehmen und diese Linie an die Spitze Ihrer Methode hinzu:

return doc.css(title_selector).text if title_selector 

Dann meine ursprüngliche Linie wird:

:title => get_title(page, title_selector) 
+0

Sorgfältig. '.text' wird nur an einem von diesen aufgerufen, und der eine ist' css', der andere 'at_css'. – tadman

+0

Mmm, ich denke ich habe es nicht gut erklärt. Argument in page.css() ist ein CSS-Selektor wie '#title> .title-class> h1'. Also get_title (doc) in diesem Bereich funktioniert nicht, da get_title eine ausgekratzte Titelseite ('Amazon.com ...) zurückgibt, keine .css-Auswahl. FYI doc = vollständige HTML-Quelle im Nokogiri-Format. Thks. –

+0

Ah, deine Erklärung war in Ordnung. Mein Leseverständnis fehlte. Ich denke, mein Schnitt sollte es jetzt abdecken. – Johnson