不知你是否遇到过这样的情况:在下载一个网页时,有些图片并未能下载下来呢,这是因为有些背景图或效果渲染的图片被写在css文件里了(还有的就是讨厌的js调用,不在本文范围),在下载网页的时候这些图片没有被保存到当地。如果css里背景url用的是绝对地址当然页面还是会显示的,但大多用的是相对于css文件所在目录的相对地址。
本文为大家介绍一个perl小脚本,负责把css文件中的图片保存到当地,并把css中图片的url修改为当前css的相对地址,输出一个新的css文件。网页使用新生成的css文件后我们在打开页面时就好多了。
此脚本并无技巧可言,但这就是Perl,能随时帮你处理你遇到的问题。
#!/bin/perl
use strict;
use warnings;
use LWP::Simple;
use URI;
my $dir='img'; #存放图片的文件夹名称
my $css_url='http://www.some_url.com/some_dir/maybe_another_dir/'; #原网站css文件所在目录
open CSS,"<mycss.css" or die "can't open file:$! "; #要处理的css文件
open NEW,">new_css.css" or die "can't open file:$!"; #生成的新css文件
mkdir $dir;
my %url;
while(<CSS>){
while(/urls*?(s*?(?:"|')?s*?(.*?)s*?(?:"|')?s*?)/sg){
$url{$1}="n";
}
s/(urls*?(s*?(?:"|')?s*?).*?(/w+.w+s*?(?:"|')?s*?))/$1$dir$2/sg;
print NEW;
}
close CSS;
for (keys %url){
if (/^http:/){
getimg($_);
} else {
my $myurl=URI->new_abs($_,$css_url);
getimg($myurl);
}
}
sub getimg {
my $link=shift;
my $name=$1 if $link=~//([^/]+)$/;
print "Get $name now...n";
my $img=get("$link");
open IMG,">$dir/$name" or die "$!";
binmode(IMG);
print IMG $img;
close IMG;
}