Regex 通过全局替换循环并在循环中执行代码 使用WWW::Mechanize; mkdir“图像”; $url=”https://www.somedomain.com/"; $mech=新WWW::Mechanize; $mech->get($url); $num=1; $year=2019年; $number=23; $content=q{}; 而($content=~s/(]+?)\([A-Za-z]+)“/$1”图像\/${year}{number}{$num.$3”/g) { $imageuri=“$2.$3”; 打印$imageuri,“\n”; $mech->get($imageuri); $mech->保存内容(“图像/${year}{number}{num.$3”); $num++; } 打印$content,“\n”; < Per>可以在Perl中执行以上操作吗?我希望 SRC属性被替换为新的路径和文件名,并用该路径和文件名下载和保存图像文件。< /P> < P>您可以做以下操作(但您应该真正考虑使用真正的HTML解析器): $content=~s{(]+?)\([A-Za-z]+)”){ my$imageuri=“$2.$3”; 打印$imageuri,“\n”; $mech->get($imageuri); my$file=“images/${year}{number}{$num.$3”; $num++; $mech->保存内容($file); qq($1“$file”) }eg;
替换操作符上的Regex 通过全局替换循环并在循环中执行代码 使用WWW::Mechanize; mkdir“图像”; $url=”https://www.somedomain.com/"; $mech=新WWW::Mechanize; $mech->get($url); $num=1; $year=2019年; $number=23; $content=q{}; 而($content=~s/(]+?)\([A-Za-z]+)“/$1”图像\/${year}{number}{$num.$3”/g) { $imageuri=“$2.$3”; 打印$imageuri,“\n”; $mech->get($imageuri); $mech->保存内容(“图像/${year}{number}{num.$3”); $num++; } 打印$content,“\n”; < Per>可以在Perl中执行以上操作吗?我希望 SRC属性被替换为新的路径和文件名,并用该路径和文件名下载和保存图像文件。< /P> < P>您可以做以下操作(但您应该真正考虑使用真正的HTML解析器): $content=~s{(]+?)\([A-Za-z]+)”){ my$imageuri=“$2.$3”; 打印$imageuri,“\n”; $mech->get($imageuri); my$file=“images/${year}{number}{$num.$3”; $num++; $mech->保存内容($file); qq($1“$file”) }eg;,regex,perl,while-loop,Regex,Perl,While Loop,替换操作符上的e修饰符使perl将替换部分解析为代码块,而不是字符串 其他说明: 始终使用use strict启动Perl文件;使用警告或同等版本(例如,使用严格的可替换为使用v5.12.0或更高版本) 避免使用间接对象语法(新建WWW::Mechanize)。改用普通方法调用(WWW::Mechanize->new) 除非您确实需要包变量,否则请使用局部变量(例如,my$num=1;) 这里有一种使用HTML解析器的方法 这会将src属性更改为已处理节点中的新值,并将树中的该节点替换为所有
e
修饰符使perl将替换部分解析为代码块,而不是字符串
其他说明:
- 始终使用
use strict启动Perl文件;使用警告代码>或同等版本(例如,
可替换为使用严格的
或更高版本)使用v5.12.0
- 避免使用间接对象语法(
)。改用普通方法调用(新建WWW::Mechanize
)WWW::Mechanize->new
- 除非您确实需要包变量,否则请使用局部变量(例如,
)my$num=1;
- 这里有一种使用HTML解析器的方法
这会将
src
属性更改为已处理节点中的新值,并将树中的该节点替换为所有img
标记的已更改副本
$content =~ s{(<img.+?src=)"([^>]+?)\.([A-Za-z]+)"}{
my $imageuri = "$2.$3";
print $imageuri, "\n";
$mech->get($imageuri);
my $file = "images/${year}_${number}_$num.$3";
$num++;
$mech->save_content($file);
qq($1"$file")
}eg;
使用:
while($content=~s/pattern/repl/g)
应该是while($content=~/pattern/g)
始终使用严格使用;使用警告
@ikegami我需要替换,然后再进行替换,或者使用我在回答您前面的问题时描述的方法同时进行这两项操作。或者使用适当的HTML解析器使用“间接对象语法”创建对象时会出现什么问题?
$content =~ s{(<img.+?src=)"([^>]+?)\.([A-Za-z]+)"}{
my $imageuri = "$2.$3";
print $imageuri, "\n";
$mech->get($imageuri);
my $file = "images/${year}_${number}_$num.$3";
$num++;
$mech->save_content($file);
qq($1"$file")
}eg;
use warnings;
use strict;
use feature 'say';
use HTML::TreeBuilder;
my $content = join '', <DATA>; # join in general (not needed with one line)
my ($num, $year, $number) = (1, 2019, 23);
my $new_src_base = "images/${year}_${number}_$num";
my $tree = HTML::TreeBuilder->new_from_content($content);
my @nodes = $tree->look_down(_tag => 'img');
for my $node (@nodes) {
my ($ext) = $node->attr('src') =~ m{.*/.*\.(.*)\z}; #/
my $orig_src = $node->attr('src', $new_src_base . ".$ext"); # change 'src'
$node->replace_with($node);
# my $imageurl = $orig_src; # fetch the image etc...
# $mech->get($imageurl);
}
say $tree->as_HTML; # to inspect; otherwise print to file
__DATA__
<P><div class="row" style="text-align:center"><a target="_blank" href="/image/SG0092a.gif"> <img src="/image/SG0092a.gif" alt="graphic image" class="img-responsive graphic"/></a></div> <div class="row" style="text-align:center"><a target="_blank" href="/image/SG0092b.gif"> <img src="/image/SG0092b.gif" alt="graphic image" class="img-responsive graphic"/></a></div> <div class="row" style="text-align:center"><a target="_blank" href="/image/SG0092c.gif"> <img src="/image/SG0092c.gif" alt="graphic image" class="img-responsive graphic"/></a></div> <div class="row" style="text-align:center"><a target="_blank" href="/image/SG0092d.gif"> <img src="/image/SG0092d.gif" alt="graphic image" class="img-responsive graphic"/></a></div> <div class="row" style="text-align:center"><a target="_blank" href="/image/SG0092e.gif"> <img src="/image/SG0092e.gif" alt="graphic image" class="img-responsive graphic"/></a></div>
for my $node (@nodes) {
my ($ext) = ( $node->attr('src') ) =~ m{.*/.*\.(.*)\z}; #/
my $copy = $node->clone;
my $orig_src = $copy->attr('src', $new_src_base . ".$ext");
$node->replace_with($copy)->delete;
...
}
use strict;
use warnings;
use Mojo::DOM;
use Mojo::UserAgent;
my $ua = Mojo::UserAgent->new;
my $dom = Mojo::DOM->new($content);
my $num = 1;
foreach my $img ($dom->find('img[src]')->each) {
next unless $img->{src} =~ m/\.([a-zA-Z]+)\z/;
my $ext = $1;
my $path = "images/${year}_${number}_$num.$ext";
$ua->get($img->{src})->result->save_to($path);
$img->attr(src => $path);
$num++;
}
print $dom->to_string;