2010-08-02 74 views
3

我想編寫一個shell腳本來從rss訂閱源獲取圖像。 現在我有:使用curl解析XML,獲取圖像的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' 

這我用搶在文件中的圖像URL的第一次出現。 現在我想把這個URL放在一個變量中,再次使用cURL來下載圖像。 任何幫助表示讚賞! (你也可以就如何更好地與網址中的行刪除一切的竅門這是行:。

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

很可能有一些更好的正則表達式來刪除除該URL不是我的解決方案的一切) 謝謝提前!

回答

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 
+0

添加了XML示例 - 可能更有用的RSS – DVK 2010-08-02 21:02:28

0

使用DOM解析器並提取所有的img元素us ing getElementsByTagName。然後將它們添加到列表/數組中,循環並分別獲取它們。

我會建議使用Python,但任何語言都會有一個DOM庫。

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 

這完全沒有工作! 關於正則表達式的任何想法?

+2

「任何想法的正則表達式」?是。 **不要使用REGEX **,請使用Dom lib :) – 2010-08-02 20:20:47

+0

如果它能完成這項工作,爲什麼要問這個問題? – 2010-08-02 20:43:30

+0

這個答案至少是其他人的原創,如果你在機器上的所有東西都是基本的bash/curl,那麼grep/sed可以很好地一起工作。雖然我同意DOM庫更好,但OP沒有要求使用python腳本,他要求提供shell腳本(並不是最精確的分類)。 – cchamberlain 2015-07-23 05:49:18

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這樣的貪婪匹配器

1

我用wget代替但它只是相同

#!/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 "{}"