Рубин Условный аргумент метода
У меня есть несколько "общих" методов, которые извлекают данные на основе селекторов CSS, которые обычно одинаковы на многих веб-сайтах. Однако у меня есть другой метод, который принимает в качестве аргумента селектор CSS для данного сайта.
Мне нужно вызвать метод get_title, если аргумент title_selector не передан. Как я могу это сделать?
Соскрести, которые принимают селекторы CSS в качестве аргументов
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
Универсальный экстрактор названий
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
1 ответ
Используйте or
оператор внутри вашего page.css
вызов. Будет звонить get_title
если title_selector
фальси (ноль).
:title => page.css(title_selector || get_title(doc)).text,
Я не уверен что doc
должно быть на самом деле в этом контексте, хотя.
РЕДАКТИРОВАТЬ
Учитывая ваш комментарий ниже, я думаю, что вы можете просто рефакторинг get_title
обрабатывать всю логику. Разрешать get_title
принять необязательный title_selector
параметр и добавьте эту строку в начало вашего метода:
return doc.css(title_selector).text if title_selector
Тогда моя оригинальная строка становится:
:title => get_title(page, title_selector)