【问题标题】:How do I parse Google image URLs using Ruby and Nokogiri?如何使用 Ruby 和 Nokogiri 解析 Google 图片 URL?
【发布时间】:2013-02-01 11:20:07
【问题描述】:

我正在尝试在 Google 图片网页上制作所有图片文件的数组。

我想要一个正则表达式来提取 "imagurl=" 之后和 "&amp" 之前的所有内容,如此 HTML 所示:

<a href="http://www.google.com/imgres?imgurl=http://www.trendytree.com/old-world-   christmas/images/20031chapel20031-silent-night-chapel.jpg&amp;imgrefurl=http://www.trendytree.com/old-world-christmas/silent-night-chapel-20031-christmas-ornament-old-world-christmas.html&amp;usg=__YJdf3xc4ydSfLQa9tYnAzavKHYQ=&amp;h=400&amp;w=400&amp;sz=58&amp;hl=en&amp;start=19&amp;zoom=1&amp;tbnid=ajDcsGGs0tgE9M:&amp;tbnh=124&amp;tbnw=124&amp;ei=qagfUbXmHKfv0QHI3oG4CQ&amp;itbs=1&amp;sa=X&amp;ved=0CE4QrQMwEg"><img height="124" width="124" src="https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRLy5inpSdHxWuE7z3QSZw35JwN3upbBaLr11LR25noTKbSMn9-qrySSg"></a><br><cite title="trendytree.com">trendytree.com</cite><br>Silent Night Chapel <b>20031</b><br>400 × 400 - 58k - jpg</td>

我觉得我可以使用正则表达式来做到这一点,但我找不到使用正则表达式搜索我解析的文档的方法,但我没有找到任何解决方案。

【问题讨论】:

    标签: ruby regex rubygems nokogiri


    【解决方案1】:

    使用正则表达式的问题是您对 URL 中参数的顺序有太多了解。如果订单更改,或者&amp;amp; 消失,正则表达式将不起作用。

    相反,解析 URL,然后拆分值:

    # encoding: UTF-8
    
    require 'nokogiri'
    require 'cgi'
    require 'uri'
    
    doc = Nokogiri::HTML.parse('<a href="http://www.google.com/imgres?imgurl=http://www.trendytree.com/old-world-christmas/images/20031chapel20031-silent-night-chapel.jpg&amp;imgrefurl=http://www.trendytree.com/old-world-christmas/silent-night-chapel-20031-christmas-ornament-old-world-christmas.html&amp;usg=__YJdf3xc4ydSfLQa9tYnAzavKHYQ=&amp;h=400&amp;w=400&amp;sz=58&amp;hl=en&amp;start=19&amp;zoom=1&amp;tbnid=ajDcsGGs0tgE9M:&amp;tbnh=124&amp;tbnw=124&amp;ei=qagfUbXmHKfv0QHI3oG4CQ&amp;itbs=1&amp;sa=X&amp;ved=0CE4QrQMwEg"><img height="124" width="124" src="https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRLy5inpSdHxWuE7z3QSZw35JwN3upbBaLr11LR25noTKbSMn9-qrySSg"></a><br><cite title="trendytree.com">trendytree.com</cite><br>Silent Night Chapel <b>20031</b><br>400 × 400 - 58k - jpg</td>')
    
    img_url = doc.search('a').each do |a|
      query_params = CGI::parse(URI(a['href']).query) 
      puts query_params['imgurl']
    end
    

    哪些输出:

    http://www.trendytree.com/old-world-christmas/images/20031chapel20031-silent-night-chapel.jpg
    

    同时使用 URI 和 CGI​​,因为 URI 的 decode_www_form 在尝试解码查询时引发异常。

    我还知道使用以下方法将查询字符串解码为哈希:

    Hash[URI(a['href']).query.split('&').map{ |p| p.split('=') }]
    

    这将返回:

    {"imgurl"=> “http://www.trendytree.com/old-world-christmas/images/20031chapel20031-silent-night-chapel.jpg”, “imgrefurl”=> “http://www.trendytree.com/old-world-christmas/silent-night-chapel-20031-christmas-ornament-old-world-christmas.html”, "usg"=>"__YJdf3xc4ydSfLQa9tYnAzavKHYQ", "h"=>"400", "w"=>"400", "sz"=>"58", "hl"=>"en", “开始”=>“19”, “缩放”=>“1”, "tbnid"=>"ajDcsGGs0tgE9M:", "tbnh"=>"124", "tbnw"=>"124", "ei"=>"qagfUbXmHKfv0QHI3oG4CQ", "itbs"=>"1", “萨”=>“X”, "ved"=>"0CE4QrQMwEg"}

    【讨论】:

      【解决方案2】:

      获取所有你想做的img url

      # get all links
      url = 'some-google-images-url'
      links = Nokogiri::HTML( open(url) ).css('a')
      
      # get regex match or nil on desired img
      img_urls = links.map {|a| a['href'][/imgurl=(.*?)&/, 1] }
      
      # get rid of nils
      img_urls.compact
      

      您想要的正则表达式是/imgurl=(.*?)&amp;/,因为您想要在imgurl=&amp; 之间进行非贪婪匹配,否则贪婪的.* 会将所有内容带到字符串中的最后一个&amp;

      【讨论】:

        【解决方案3】:
        str = '<a href="http://www.google.com/imgres?imgurl=http://www.trendytree.com/old-world-     christmas/images/20031chapel20031-silent-night-chapel.jpg&amp;imgrefurl=http://www.trendytree.com/old-world-christmas/silent-night-chapel-20031-christmas-ornament-old-world-christmas.html&amp;usg=__YJdf3xc4ydSfLQa9tYnAzavKHYQ=&amp;h=400&amp;w=400&amp;sz=58&amp;hl=en&amp;start=19&amp;zoom=1&amp;tbnid=ajDcsGGs0tgE9M:&amp;tbnh=124&amp;tbnw=124&amp;ei=qagfUbXmHKfv0QHI3oG4CQ&amp;itbs=1&amp;sa=X&amp;ved=0CE4QrQMwEg"><img height="124" width="124" src="https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRLy5inpSdHxWuE7z3QSZw35JwN3upbBaLr11LR25noTKbSMn9-qrySSg"></a><br><cite title="trendytree.com">trendytree.com</cite><br>Silent Night Chapel <b>20031</b><br>400 × 400 - 58k - jpg</td>'
        str.split('imgurl=')[1].split('&amp')[0]
        #=> "http://www.trendytree.com/old-world-     christmas/images/20031chapel20031-silent-night-chapel.jpg"
        

        这就是你要找的吗?

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-01-05
          • 1970-01-01
          • 2012-07-05
          • 2014-07-05
          • 2013-04-02
          • 2014-09-15
          • 2016-01-05
          • 2013-04-02
          相关资源
          最近更新 更多