0

ローカルに保存されているHTMLファイルからすべてのリンクを取得し、File :: Findを使用してHTMLファイルを取得するハッシュを作成しようとしていますが、コードから除外しています。

  1. 最初のハッシュキーはタイトルになります
  2. 2番目のキーはミラーです
  3. パーツの3番目のキー、次にURL

お気に入り

$hash{$title}{$mirror}{$part}=$url;

単一のパーツと単一のミラーを持つリンクを取得できますが、複数のパーツを取得できません。現在、ループに陥っています。URLに一致するパターンでミラーを取得していますが、パーツが存在する場合はどうすれば取得できますか?それ以外の場合は$ part="part_1"次のURLに移動する必要があります

#!/usr/bin/perl

my $Html = qq(
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
      <meta http-equiv="content-type" content="text/html; charset=windows-1250">
      <meta name="generator" content="PSPad editor, www.pspad.com">
      <title>First hash key</title>
      </head>
      <body>
      <div>
       <br><b>Multi Links</b><br><br><!--colorstart:#FF0000-->

       <span style="color:#FF0000"><!--/colorstart--><b>Mirror 1</b><!--colorend--></span><!--/colorend-->
       <br><a href="http://mirror1.com/rvvaq1hi" target="_blank"><b>Part 1</b></a>
       <br><a href="http://mirror1.com/w33h9ym2" target="_blank"><b>Part 2</b></a>
       <br><a href="http://mirror1.com/fdnppn15" target="_blank"><b>Part 3</b></a></div>

        </div>
      <div>
      <br><b>Single link multiple mirrors</b><br>
      <br><a href="http://mirror1.com/t2wx9603" target="_blank"><!--colorstart:#FF0000--><span style="color:#FF0000"><!--/colorstart--><b>Mirror 1</b><!--colorend--></span><!--/colorend--></a></div>
        <br><a href="http://mirror2.com/t2wx9603" target="_blank"><!--colorstart:#FF0000--><span style="color:#FF0000"><!--/colorstart--><b>Mirror 2</b><!--colorend--></span><!--/colorend--></a></div>    

        </div>

      </body>
    </html>
);
my @html = split(\n,$Html);
    my $TheMain;
    my $Title;
    my @Names=(Mirror1,Mirror2,Mirror3);
    my %hash;

      foreach my $line (@html)
        {
        print "Da Line [$line]\n";
        if ($line =~ m{<title>(.*?)</title>} )
          {
           $Title = $1;
           print "$Title\n";
          }
         $line =~ s/\"/'/g;   # Double quotes to single
         $line=~ s{\n}{}g;  #remove \n
         $line=~ s{\s+}{ }g;#remove excessive spaces

          $TheMain = $TheMain . $line;
        }
        print "$TheMain\n";
     unless ($TheMain eq "") # unless empty enter the loop
       {
        while ($TheMain =~ m{a href=(.*?)/a}) 
        {
            my $A = $1;
            print "the A  $A\n";  ## stuck in a loop
            my ($url,$part);
            $A =~ s/<.*?color.*?>//ig;
            while ($A =~ m{\'(http.*?)\'.*?<b>(.*?)</b> }gi)
              {
               $url = $1;
               $part = $2;
               if ($part =~m/part/i)
                {
                  $part =~ s/ /_/;
                }
               else
                {
                  $part = "part_1";
                } 
              }

           foreach my $mirror (@NAMES)   # fillters out unwanted links
            {
              if ($url =~/$mirror/i)
                {
                  $hash{$Title}{$mirror}{$part}=$url;
                }
            }
          }
        }

for my $Title (sort keys %hash) 
  {
    for my $Host  (sort keys %{$hash{$Title}})
      {

          for my $part (sort keys %{$hash{$Title}{$Host}})
            {

               my $url = $hash{$Title}{$Host}{$part};
               print "$Title,$url\n";
             } 
      }
     }    
4

1 に答える 1

0

「HTML を正規表現で解析するにはどうすればよいですか?」という一般的な質問に対するこの包括的な回答を参照してください。

正規表現は、XHTML 自己完結型タグを除く開始タグに一致します

于 2012-09-26T14:07:16.580 に答える