我想编写一个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以外的所有内容。) 提前谢谢!
答案 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
这样的贪婪匹配器)