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
Sorgfältig. '.text' wird nur an einem von diesen aufgerufen, und der eine ist' css', der andere 'at_css'. – tadman
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. –
Ah, deine Erklärung war in Ordnung. Mein Leseverständnis fehlte. Ich denke, mein Schnitt sollte es jetzt abdecken. – Johnson