使用Ruby从URL中提取数据

时间:2014-10-29 03:28:01

标签: ruby regex parsing url

我是ruby的新手,我试图使用Ruby返回ASIN列表和相应的价格。我能够非常接近我需要的东西,但需要帮助来回答2个问题:

  1. 如何摆脱ASIN周围的 [[' > \ n"]] (见下面的结果)
  2. 是否有更简单的方法从URL中提取ASIN而不是使用此正则表达式?
  3. 非常感谢你的帮助!

    以下是我从当前代码到终端的内容:

    [["B00EJDIG8M\n"]] - $7.00
    [["B00KJ07SEM\n"]] - $26.99
    [["B000FAR33M\n"]] - $119.00
    [["B00LLMKPVK\n"]] - $22.99
    [["B007NXPAQG\n"]] - $9.47
    [["B004W5WAMU\n"]] - $22.43
    [["B00LFUNGU0\n"]] - $17.99
    [["B0052G14E8\n"]] - $54.99
    [["B002MPLYEW\n"]] - $212.99
    [["B00009W3G7\n"]] - $6.61
    [["B000NCTOUM\n"]] - $3.04
    [["B009SANIDO\n"]] - $12.29
    [["B0052G51AQ\n"]] - $67.99
    [["B003XEUEPQ\n"]] - $26.74
    [["B00CYH9HRO\n"]] - $25.75
    [["B00KV0SKQK\n"]] - $21.99
    [["B009PCI2JU\n"]] - $56.66
    [["B00LLM6ZFK\n"]] - $24.99
    [["B004RQDY60\n"]] - $18.40
    [["B000JLNBW4\n"]] - $49.14
    

    以下是代码:

    require 'rubygems'
    require 'nokogiri'   
    require 'open-uri'
    PAGE_URL = "http://www.amazon.com/Best-Sellers-Appliances/zgbs/appliances/ref=zg_bs_nav_0"
    
    page = Nokogiri::HTML(open(PAGE_URL))
    page.css(".zg_itemWrapper").each do |item|  
      price = item.at_css(".zg_price .price").text
      asin = item.at_css(".zg_title a")[:href].scan(/http:\/\/(?:www\.|)amazon\.com\/(?:gp\/product|[^\/]+\/dp|dp)\/([^\/]+)/)
      puts "#{asin} - #{price}"  
    end  
    

2 个答案:

答案 0 :(得分:3)

此时最简单的做法是在插值过程中清理当前的 asin 值,而不是清理你的Nokogiri搜索。例如:

puts "#{asin.flatten.pop.chomp} - #{price}"

答案 1 :(得分:0)

关于问题2,我意识到我并不真正需要正则表达式,并找到了一种方法,可以用更短的代码行获得相同的结果

替换

asin = item.at_css(".zg_title a")[:href].scan(/http:\/\/(?:www\.|)amazon\.com\/(?:gp\/product|[^\/]+\/dp|dp)\/([^\/]+)/)

asin =  item.at_css(".zg_title a")[:href].split("/")[5].chomp