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" /> 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" />

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;