Ruby 使用Nokogiri刮取多个页面

Ruby 使用Nokogiri刮取多个页面,ruby,command-line-interface,nokogiri,Ruby,Command Line Interface,Nokogiri,我正在编写一个Ruby CLI,其中我必须列出咖啡店,然后用户通过使用Nokogiri和open uri来选择一家来显示其信息。然而,这些信息来自他们各自的网页,包含这些信息 以下是我正在使用的网页: 以下是我需要从中获取信息的9个网页之一: 以下是我的代码,专门用于抓取其中一页: def self.scrape_shops url = "https://cincinnatiusa.com/article/9-hot-coffee-shops" doc = Nokogiri

我正在编写一个Ruby CLI,其中我必须列出咖啡店,然后用户通过使用Nokogiri和open uri来选择一家来显示其信息。然而,这些信息来自他们各自的网页,包含这些信息

以下是我正在使用的网页:

以下是我需要从中获取信息的9个网页之一:

以下是我的代码,专门用于抓取其中一页:


  def self.scrape_shops
    url = "https://cincinnatiusa.com/article/9-hot-coffee-shops"
    doc = Nokogiri::HTML(open(url))
    shops = doc.css(".article-body h2").each do |shop|
    name = shop.text.strip
    BestCoffeeCinci::Shop.new(name)
    end 
  end

  def self.scrape_info
    url = "https://cincinnatiusa.com/eat-and-drink/carabello-coffee"
    doc = Nokogiri::HTML(open(url))
    address = doc.css(".address").text
    hours = doc.css(".hours").text
    description = doc.css(".full-description").text
    binding.pry
    end
  end

在使用不同的网页时,如何在不列出每个单独网页的情况下获取每个咖啡店的地址、营业时间和说明?谢谢

每个页面都有不同的结构,所以如果您希望这样做,您需要用更抽象的术语来定义它。例如,考虑使用YAML作为配置格式,正如@ TADMAN所写的那样,每个页面针对相同的信息实现不同的选择器。处理此问题的一种方法是编写一个
case
语句(在其他语言中称为
switch
语句),在该语句中,您可以
尝试
查找类似
.address
的css选择器,如果未找到任何选择器,则可以
尝试
查找其他选择器,直到找到匹配项。这不是特别高性能的代码,但它将允许您在将来干涸代码并扩展到其他站点。您可以使用yaml文件为每个页面进行配置,在这种情况下,您将为要提取的每个信息定义xpath。您的问题非常广泛。我们不知道你的专业水平,所以写一个清晰简洁的答案会导致写一篇教程,这是离题的。为做SEO的公司编写了大型爬行器,包括一个搜索财富50强公司网站套件的公司,它需要代码,可以在不关闭爬行器的情况下进行修改,允许在运行时进行动态重新配置,以便微调搜索并减少不良数据。这不容易在回答中解释。每个页面都有不同的结构,所以如果你想这样做,你需要用更抽象的术语来定义它。例如,考虑使用YAML作为配置格式,正如@ TADMAN所写的那样,每个页面针对相同的信息实现不同的选择器。处理此问题的一种方法是编写一个
case
语句(在其他语言中称为
switch
语句),在该语句中,您可以
尝试
查找类似
.address
的css选择器,如果未找到任何选择器,则可以
尝试
查找其他选择器,直到找到匹配项。这不是特别高性能的代码,但它将允许您在将来干涸代码并扩展到其他站点。您可以使用yaml文件为每个页面进行配置,在这种情况下,您将为要提取的每个信息定义xpath。您的问题非常广泛。我们不知道你的专业水平,所以写一个清晰简洁的答案会导致写一篇教程,这是离题的。为做SEO的公司编写了大型爬行器,包括一个搜索财富50强公司网站套件的公司,它需要代码,可以在不关闭爬行器的情况下进行修改,允许在运行时进行动态重新配置,以便微调搜索并减少不良数据。这在回答中不容易解释。