【问题标题】:Use curl to parse XML, get an image's URL and download it使用 curl 解析 XML,获取图片的 URL 并下载
【发布时间】:2023-04-05 05:17:02
【问题描述】:

我想编写一个 shell 脚本来从 rss 提要中获取图像。 现在我有:

curl http://foo.com/rss.xml | grep -E '<img src="http://www.foo.com/full/' | head -1 | sed -e 's/<img src="//' -e 's/" alt=""//' -e 's/width="400"//' -e 's/  height="400" \/>//' | sed 's/ //g'

我用它来抓取文件中第一次出现的图像 URL。 现在我想把这个 URL 放在一个变量中,以便再次使用 cURL 来下载图像。 任何帮助表示赞赏! (您也可以提供有关如何更好地从带有 URL 的行中删除所有内容的提示。这是行:

 <img src="http://www.nichtlustig.de/comics/full/100802.jpg" alt="" width="400" height="400" />

可能有比我的解决方案更好的正则表达式来删除除 URL 之外的所有内容。) 提前致谢!

【问题讨论】:

    标签: perl curl shell download


    【解决方案1】:

    使用正则表达式解析 HTML/XML 是 Bad Idea in general。因此,我建议您使用适当的解析器。

    如果您不反对使用 Perl,让 Perl 使用适当的解析器库为您进行适当的 XML 或 HTML 解析:

    HTML

    curl http://BOGUS.com |& perl -e '{use HTML::TokeParser; 
        $parser = HTML::TokeParser->new(\*STDIN); 
        $img = $parser->get_tag('img') ; 
        print "$img->[1]->{src}\n"; 
    }'
    
    /content02/groups/intranetcommon/documents/image/blk_logo.gif
    

    XML

    curl http://BOGUS.com/whdata0.xml | perl -e '{use XML::Twig;
        $twig=XML::Twig->new(twig_handlers =>{img => sub { 
           print $_[1]->att("src")."\n"; exit 0;}}); 
        open(my $fh, "-");
        $twig->parse($fh);
    }'
    
    /content02/groups/intranetcommon/documents/image/blk_logo.gif
    

    【讨论】:

    • 添加 XML 示例 - 可能对 RSS 更有用
    【解决方案2】:

    我用wget代替curl,但还是一样

    #!/bin/bash
    url='http://www.nichtlustig.de/rss/nichtrss.rss'
    wget -O- -q "$url" | awk 'BEGIN{ RS="</a>" }
    /<img src=/{
      gsub(/.*<img src=\"/,"")
      gsub(/\".[^>]*>/,"")
      print
    }'  |  xargs -i wget "{}"
    

    【讨论】:

      【解决方案3】:

      使用 DOM 解析器并使用 getElementsByTagName 提取所有 img 元素。然后将它们添加到列表/数组中,循环并分别获取它们。

      我建议使用 Python,但任何语言都会有 DOM 库。

      【讨论】:

        【解决方案4】:
        #!/bin/sh
        URL=$(curl http://foo.com/rss.xml | grep -E '<img src="http://www.foo.com/full/' | head -1 | sed -e 's/<img src="//' -e 's/" alt=""//' -e 's/width="400"//' -e 's/  height="400" \/>//' | sed 's/ //g')
        curl -C - -O $URL
        

        这完全可以完成工作! 对正则表达式有任何想法吗?

        【讨论】:

        • “关于正则表达式的任何想法”?是的。 不要使用正则表达式,使用 Dom lib :)
        • 如果它成功了,你为什么要问这个问题?
        • 这个答案至少是其他人的原创,如果你在机器上只有基本的 bash / curl,那么 grep / sed 可以很好地协同工作。虽然我同意 DOM 库更好,但 OP 并没有要求 python 脚本,他要求的是 shell 脚本(当然这不是最精确的分类)。
        【解决方案5】:

        这是一个快速的 Python 解决方案:

        from BeautifulSoup import BeautifulSoup
        from os import sys
        
        soup = BeautifulSoup(sys.stdin.read())
        print soup.findAll('img')[0]['src']
        

        用法:

        $ curl http://www.google.com/`curl http://www.google.com | python get_img_src.py`
        

        这就像一个魅力,不会让你试图找到可以解析随机 HTML 的神奇正则表达式(提示:没有这样的表达式,尤其是如果你有一个像 sed 这样的贪婪匹配器。)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-12-15
          • 2021-07-28
          • 2013-02-08
          • 1970-01-01
          • 2016-03-28
          • 1970-01-01
          相关资源
          最近更新 更多