Ruby方法的条件参数

时间:2016-07-12 16:30:00

标签: ruby web-scraping nokogiri conditional-attribute

我有一些'泛型'基于css选择器提取数据的方法,这些选择器在许多网站中通常是相同的。但是我有另一种方法接受给定网站的css选择器作为参数。

如果title_selector参数是nos传递,我需要调用get_title方法。我怎么能这样做?

Scrape接受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 个答案:

答案 0 :(得分:2)

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)