使用curl解析XML,获取图像的URL并下载它

时间:2010-08-02 20:10:17

标签: perl curl shell download

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

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以外的所有内容。) 提前谢谢!

5 个答案:

答案 0 :(得分:2)

使用正则表达式解析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

答案 1 :(得分:1)

我使用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 "{}"

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

#!/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

这完全可以胜任! 关于正则表达式的任何想法?

答案 4 :(得分:0)

这是一个快速的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这样的贪婪匹配器